为什么GCC保持空function?

在大多数情况下,如果我想在C中创建一个可选function,我只需创建两个这样的函数:

#ifdef OPTIONAL_SOMETHING void do_something(int n, const char *s) { while (n--) { printf("%s", s); } /* ...You might get the point, really do something... */ } #else void do_something(int n, const char *s) { /* Empty body */ } #endif 

因此,如果符号未定义 – 禁用该function时 – 将空函数编译到可执行文件中。

深入研究汇编列表,似乎GCC 在禁用优化编译并调用空函数。 如果启用优化 ,也使用了-O2-O3 ,它只编译必要的堆栈处理代码,但它会优化调用指令。 总而言之,它保留了function。

大约相同的情况适用于非空但未使用的方法。

它应该简单地扔掉整个东西,但事实并非如此。 为什么它是默认行为? 只是为了好奇:我怎么能消除这个?

由于函数具有外部链接(不是static ),编译器无法消除它,因为另一个目标文件可能引用它。 如果该function是static ,它将被完全消除。

如果您希望编译器最终内联您告诉他的function。 声明你的函数inline ,这允许编译器在它认为合适时发出函数。

现在,当您使用-O0进行编译时,这可能会导致“未定义的符号”错误。 像“实例化”一样

 void do_something(int n, const char *s); 

只在一个编译单元(.c文件)中。