为什么发布版在调试过程中不进行构建,而只针对使用相同源文件的一个项目? C++编译器用于Xilinx SDK,编译ZYNQ SoC(ARM核)的代码,抱怨未初始化变量,但只在发布版本中,只针对一个项目。调试正常,对于链接到同一源文件newthing.cpp的另一个项目,调试和发布版本都正常。我看不到依赖于项目的ifdef。就我所知,所有的构建设置都是相同的,当然除了调试信息和优化在发布和调试之间是不同的,但在项目之间并没有什么不同。我们中的一个人怀疑Xilinx工具中有一个bug,但除了IDE中的makefiles或Build设置等明显的地方之外,可能还有细微的差别

为什么发布版在调试过程中不进行构建,而只针对使用相同源文件的一个项目? C++编译器用于Xilinx SDK,编译ZYNQ SoC(ARM核)的代码,抱怨未初始化变量,但只在发布版本中,只针对一个项目。调试正常,对于链接到同一源文件newthing.cpp的另一个项目,调试和发布版本都正常。我看不到依赖于项目的ifdef。就我所知,所有的构建设置都是相同的,当然除了调试信息和优化在发布和调试之间是不同的,但在项目之间并没有什么不同。我们中的一个人怀疑Xilinx工具中有一个bug,但除了IDE中的makefiles或Build设置等明显的地方之外,可能还有细微的差别,c++,compiler-errors,xilinx,vivado,C++,Compiler Errors,Xilinx,Vivado,问题在于这样的代码(在newthing.cpp中): newthing.cpp中定义的结果结构如下所示: int GetSomeResult(int n, Result &res) { res.blip = n + 100; res.bloop = 50; return n; } 注意,我忽略了GetSomeResult的返回值,但我怀疑这是否相关 这是假阴性 如果可以,在将结构传递给GetSomeResult之前,只需初始化结构即可: Result R = {};

问题在于这样的代码(在newthing.cpp中):

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

作为一个粗略的猜测,考虑在错误代码之前移动<代码> GETSOMERESULTS/<代码>定义(这是非常简化的,我想)。即使在大多数传统的环境中,我仍然时常遇到这样的问题——这里的关键点是将结构初始化为函数的副作用。编译器只是出于自身的原因在某个时候停止def use分析。我们发现问题出在编译器选项中,-Wno可能未初始化,在为一个项目构建静态库的makefile中给出,但在另一个项目的makefile中没有。这不是主要的makefile,所以需要更多的挖掘才能找到。该选项仅影响发布版本。我们不想改变构建系统,因此我们在源代码中采取了一种变通方法。我们不愿意改变构建系统中的makefile或任何东西,因为这可能会打乱其他系统。添加空构造函数看起来是目前最好的方法。@DarenW:它已经有一个隐式定义的“空”构造函数;您不需要(也不应该)添加构造函数(如果您添加了构造函数,那么为了解决此问题,它必须不为空)。你应该照我的建议去做。
Result R = {};
GetSomeResult(7, R);
PushData(R.blip);
Result GetSomeResult(const int n)
{
   Result res;
   res.blip = n + 100;
   res.bloop = 50;
   return res;
}

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