禁用编译

时间:2014-04-10 18:46:42

标签: c++ c g++ clang compiler-optimization

有没有办法指示g ++或clang不编译掉代码中没有使用的变量?我知道大多数编译器会编译出不影响最终输出的部分代码。出于调试原因,我想知道是否有办法禁用它?

3 个答案:

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