在大多数情况下,如果我想在 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在优化被禁用时编译并调用空函数。如果启用了优化,也使用and ,它只编译必要的堆栈处理代码,但它优化了调用指令。总而言之,它保留了功能。-O2
-O3
大约同样适用于非空但未使用的方法。
它应该简单地扔掉整个东西,但事实并非如此。为什么这是默认行为?只是为了好奇:我怎样才能消除这个?