Компилятор 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, но сомневаюсь, что это актуально.
Это ложный минус.
Если вы можете, просто инициализируйте нулевую структуру, прежде чем передать ее 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);
Других решений пока нет …