为什么Release不是通过Debug进行构建,而是仅针对使用相同源文件的其中一个项目?

时间:2017-07-11 22:49:23

标签: c++ compiler-errors xilinx vivado

针对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的返回值,但我怀疑这是否相关。

1 个答案:

答案 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);