有没有办法指示g ++或clang不编译掉代码中没有使用的变量?我知道大多数编译器会编译出不影响最终输出的部分代码。出于调试原因,我想知道是否有办法禁用它?
答案 0 :(得分:5)
是。在gcc(也可能是clang)中,您可以使用-O0
进行编译。这将禁用所有优化。您也可以使用-Og
,它不应删除变量。此标志仅打开“调试器友好”优化。
答案 1 :(得分:2)
只需声明变量volatile
即可。这样做的好处是可以在任何编译器上工作而无需编译器特定的扩展或命令行选项 - 它还允许您具体了解哪些变量得到了这种处理。如果您希望能够删除volatile for release版本,可以使用以下命令:
#if defined NDEBUG
#define DEBUG_VOLATILE
#else
#define DEBUG_VOLATILE volatile
#endif
然后声明如:
DEBUG_VOLATILE debug_var = 0 ;
仅在调试版本中是易变的。
答案 2 :(得分:0)
也许:
int foobar __attribute__((used));
文档http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html说(强调添加):
此属性附加到具有[sic] 静态 存储的变量,表示即使看起来未引用该变量,也必须发出该变量。
更新1: 也许这是https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem也就是说,您实际上要解决的问题是什么?
无论如何,正如dma在评论中指出的那样,这个解决方案会受到影响,因为对于非调试版本而言,添加到代码中的任何内容都会更难删除#34;。同意。
更新2 :使用-s
编译此4行文件:
int foo1 = 111;
static int foo2 = 222;
static int volatile foo3 = 333;
static int __attribute__((used)) foo4 = 444;
给(删节):
.globl foo1
.data
foo1:
.long 111
foo4:
.long 444
也就是说,使用Clifford建议foo3
的变量volatile
是 编译出 ,而{{1 }} 保持。 (gcc 4.1.2)
但是, 另一方面,编译:
foo4
给出:
警告:&#39>使用'属性被忽略
<强> 和 强>
void bar(void) {
int bar2 = 222;
int volatile bar3 = 333;
int __attribute__ ((used)) bar4 = 444;
}
所以情况恰恰相反:movl $333, -4(%ebp)
有效且volatile
没有效果(可能是预期的,因为__attribute__ ((used))
不是bar4
)。