为什么GCC保持空功能?

Áko*_*ács 14 c macros optimization gcc function

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

#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
Run Code Online (Sandbox Code Playgroud)

因此,如果符号未定义 - 禁用该功能时 - 将空函数编译到可执行文件中.

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

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

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

Jon*_*ler 26

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

  • *编译器*无法消除它们,因为它们是否在翻译时使用尚不清楚.只有链接器可以消除它们,但这只有在编译器被指示(通过一个特殊的`-f`选项,其名称我忘记)将每个函数放在它自己的部分中,并且如果链接器被告知垃圾的情况下,这是唯一可能的. - 收集未参考的部分. (5认同)
  • 然而,这仍然留下了一个问题,即为什么GCC在身体被称为空时不会内联函数体(即省略调用). (4认同)
  • 不,他们没有称他们只是存在.(Debian GCC 4.4.5-8). (2认同)