Почему Release не собирается, хотя идет Debug, а только для одного из проектов, использующих один и тот же исходный файл?

Компилятор C ++ для Xilinx SDK, компилирующий код для Zynq SoC (ядро ARM), жалуется на неинициализированную переменную, но только в сборке Release и только для одного проекта. Отладка в порядке, а сборки Debug и Release подходят для другого проекта, связанного с тем же исходным файлом newthing.cpp. Нет никаких зависящих от проекта #ifdefs, которые я могу видеть. Насколько я могу судить, все параметры сборки одинаковы, за исключением того, что, конечно, информация об отладке и оптимизация отличаются в Release и Debug, но не различаются в разных проектах. Один из нас подозревает ошибку в инструментах Xilinx, но, возможно, есть небольшая разница где-то, кроме очевидных мест, таких как make-файлы или параметры сборки в IDE.

Проблема в следующем коде (в newthing.cpp):

Result R;
GetSomeResult(7, R);
PushData(R.blip);     <== compiler whines: using uninitialized var

где заголовок newthing.h определяет

struct Result
{
int blip;
int bloop;
};

и структура Result, определенная в другом месте в newthing.cpp, заполняется так:

int GetSomeResult(int n, Result &res)
{
res.blip = n + 100;
res.bloop = 50;
return n;
}

Обратите внимание, что я игнорирую возвращаемое значение из GetSomeResult, но сомневаюсь, что это актуально.

2

Решение

Это ложный минус.

Если вы можете, просто инициализируйте нулевую структуру, прежде чем передать ее GetSomeResult:

Result R = {};
GetSomeResult(7, R);
PushData(R.blip);

Если это невозможно (в очень редких случаях это может быть слишком медленно / расточительно), вам придется использовать свою систему сборки или #pragma отключить это предупреждение / ошибку для этого модуля перевода.

Вы также можете попробовать использовать более новую версию вашего компилятора, если это возможно.

Конечно, ваш код был бы более идиоматичным и не восприимчивым к этой проблеме, если бы вы отказались от подхода, подобного C, и вместо этого написали:

Result GetSomeResult(const int n)
{
Result res;
res.blip = n + 100;
res.bloop = 50;
return res;
}

// const Result R = GetSomeResult(7);
// PushData(R.blip);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]