在大多数情况下,如果我想在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
因此,如果符号未定义 - 禁用该功能时 - 将空函数编译到可执行文件中。
深入到汇编列表中,当优化被禁用时,GCC 似乎编译并调用空函数。如果优化已启用,同时使用-O2
和-O3
,则仅编译必要的堆栈处理代码,但它会优化调用指令。总而言之,它保留了功能。
关于同样适用于非空但未使用的方法。
它应该简单地抛弃整个事物,但事实并非如此。为什么它是默认行为?只是为了好奇:我怎么能消除这个?
答案 0 :(得分:26)
由于函数具有外部链接(不是static
),编译器无法消除它,因为另一个目标文件可能引用它。如果函数是static
,它将被完全删除。
答案 1 :(得分:1)
如果您希望编译器最终内联您告诉他的功能。声明你的函数inline
,这允许编译器不在它认为合适时发出该函数。
现在,当使用-O0进行编译时,这可能会导致出现“未定义的符号”错误。像
一样设置“实例化”void do_something(int n, const char *s);
只在一个编译单元(.c文件)中。