c/c++语言开发共享为什么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文件)中。

    需要了解更多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

      (0)
      上一篇 2021年12月12日
      下一篇 2021年12月12日

      精彩推荐