禁用编译输出

Disable compile out

本文关键字:输出 编译      更新时间:2023-10-16

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

是。在gcc(可能还有clang)中,您可以使用-O0进行编译。这将禁用所有优化。您也可以使用-Og,它不应该删除变量。此标志仅启用"调试器友好型"优化。

只需声明变量volatile。这具有在任何编译器上工作的优势,而不需要编译器特定的扩展或命令行选项——它还允许您明确哪些变量得到这种处理。如果你想删除易失性的版本,你可以使用以下方法:

#if defined NDEBUG
    #define DEBUG_VOLATILE
#else
    #define DEBUG_VOLATILE volatile
#endif

然后声明,例如:

DEBUG_VOLATILE debug_var = 0 ;

仅在调试构建中是可变的。

也许:

   int foobar __attribute__((used));

文件http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html说(强调):

此属性附加到具有[sic]static存储的变量,意味着即使变量看起来没有被引用,也必须发出该变量。

更新1:也许这是https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem也就是说,你真正想要解决的问题是什么?

无论如何,正如dma在评论中指出的那样,这种解决方案会受到影响,因为"对于非调试构建,添加到代码中的任何内容都将更难删除"。同意。

更新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对volatile的建议,变量foo3被编译出,而foo4被保留。(gcc 4.1.2)

但是,另一方面,编译:

void bar(void) {
    int                        bar2 = 222;
    int volatile               bar3 = 333;
    int __attribute__ ((used)) bar4 = 444;
}

给出:

警告:已忽略"used"属性

和:

movl    $333, -4(%ebp)

所以情况正好相反:volatile起作用,__attribute__ ((used))不起作用(也许是意料之中的,因为bar4不是static)。