针对Xilinx SDK的C ++编译器,为Zynq SoC(ARM内核)编译代码,抱怨未初始化的变量,但仅在Release版本中,并且仅针对一个项目。调试很好,Debug和Release版本都适用于链接到同一源文件newthing.cpp的另一个项目。我没有看到与项目相关的#ifdefs。据我所知,所有构建设置都是相同的,当然调试信息和优化在发布和调试之间是不同的,但项目之间没有区别。我们中的一个人怀疑Xilinx工具中存在一个错误,但除了IDE中的makefile或Build Settings等显而易见的地方之外,其他地方可能存在细微差别。
问题在于这样的代码(在newthing.cpp中):
Result R;
GetSomeResult(7, R);
PushData(R.blip); <== compiler whines: using uninitialized var
newthing.h标头定义
struct Result
{
int blip;
int bloop;
};
和newthing.cpp中其他地方定义的Result结构填充如下:
int GetSomeResult(int n, Result &res)
{
res.blip = n + 100;
res.bloop = 50;
return n;
}
请注意,我忽略了GetSomeResult的返回值,但我怀疑这是否相关。
答案 0 :(得分:1)
这是假阴性。
如果可以,只需将结构初始化为零,然后再将其传递给GetSomeResult
:
Result R = {};
GetSomeResult(7, R);
PushData(R.blip);
如果这不可行(在非常罕见的情况下,它可能太慢/浪费),您将不得不使用您的构建系统或#pragma
关闭此翻译单元的警告/错误。< / p>
如果可能,您可能还希望尝试使用较新版本的编译器。
当然,如果你放弃了类似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);