在大多数情况下,如果我想在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文件)中。
需要了解更多c/c++开发分享为什么GCC保持空function?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享为什么GCC保持空function?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979085.html