如何停止优化器丢弃未使用的变量
How to stop optimizer discard unused variables?
我想调试我的代码,不能访问进程中的内层,因为这会干扰与硬件的通信。(易失性操作是在监视列表会干扰基本读访问的地方执行的。)
所以我正在测试接口的返回值,但IAR编译器甚至会优化未使用的易失性变量。
和这样的语句:
i = object.foo();
if (i)i=i;
也没用
我在SO上找到的只是回答了使用I/o操作的建议。但这也没有选择,因为我没有包含C标准库的选项。并且项目本身不需要I/O,也没有自己的输入/输出函数的变体。
那么除了禁用优化器,我还有什么选择呢?
最可靠的方法是在链接器文件中找到强制链接某个变量的设置。但这当然完全取决于系统。
否则,可移植的标准解决方案就是简单地在代码的某个地方编写(void)i;
。这适用于大多数编译器。如果没有,你可以更进一步:
#ifdef DEBUG_BUILD
volatile int dummy;
// all variables you would like to have linked:
dummy = i;
dummy = j;
...
#endif
或者如果你喜欢晦涩的宏:
#define FORCE_LINKING(x) { void* volatile dummy = &x; }
(void*
,因为它是类型泛型,适用于所有类型的变量。* volatile
使指针本身易失性,这意味着编译器被禁止优化掉对它的写操作。
一种常见的方法是通过宏将其放入while循环中。
#define KEEP_UNUSED(var) do { (void)var; } while(false);
IAR还有一个扩展名为__root
:http://supp.iar.com/FilesPublic/UPDINFO/004350/manuals.htm
__root属性既可以用在函数上,也可以用在变量上确保,当包含函数或变量的模块是链接,函数或变量也包括在内,无论它是否由程序的其余部分引用。
相关文章:
- 使用typeid警告未使用的变量
- 未使用的C++未优化的静态成员函数/变量
- C++未使用的变量警告,即使我在函数结束时返回它
- 如何使 Visual Studio 2010 警告未使用的变量
- C 20合同和未使用的变量
- 提升::序列化警告未使用的变量file_version
- 未使用的变量禁止打印?
- GCC和Clang不警告未使用的异常变量
- 避免在 openmp 并行块中使用预编译器语句出现未使用的变量警告
- 抑制警告:未使用的变量
- 错误:非静态数据成员的使用无效,在此范围内未声明变量
- 如何使用非平凡析构函数防止未使用的变量警告
- 为什么这个未使用的变量没有优化掉?
- 为什么msvc编译器在显式调用析构函数时会发出未使用的变量
- 警告:变量已设置,但未使用
- 检测函数范围之外的未使用变量
- 如何禁止显示有关C++中未使用变量的警告
- C++未使用变量的异常
- 为什么在c++函数中使用void(未使用)(和类似的)而不是没有名称的参数来消除未使用变量的警告
- 如何在Eclipse中禁用未使用变量警告?