c - 如果0在c程序中编译

标签 c compilation

我正在尝试从我的程序中删除未使用的代码 - 我现在无法删除代码,我只想先禁用它。

假设我有以下代码:

if (cond){
  doSomething()
}

cond 始终为 false,因此永远不会调用 doSomething

我想做这样的事情:

#define REMOVE_UNUSED_CODE 0
if (cond && REMOVE_UNUSED_CODE){
  doSomething()
}

现在这对我们(希望对编译器)来说很明显,这段代码未被使用。

编译器会删除所有这些 if 条件,还是会留下它永远不会进入?

P.S.: 我不能为此目的使用#if 0

最佳答案

GCC 将显式删除具有控制它们的常量表达式的条件 block ,以及 the GNU coding standards explicitly recommend that you take advantage of this ,而不是使用更粗糙的方法,例如依赖预处理器。尽管使用预处理器 #if 可能看起来更有效,因为它在较早阶段删除了代码,但实际上,现代优化器在您为它们提供尽可能多的信息时效果最好(当然,它会使您的程序更干净和如果您可以避免在不需要的地方添加相分离依赖性,则更加一致。

像这样的决定对于现代编译器来说非常非常非常 - 即使是非常简单的 TCC将执行一些死代码消除;强大的系统,如 LLVM GCC 会发现这一点,以及您作为人类读者可能会错过的更复杂的情况(通过跟踪变量的生命周期和修改,而不是简单地查看单个点)。

这是对完全编译的其他优势的补充,例如 if 中的代码将被检查是否有错误(而 #if 更有用删除在当前系统上错误的代码,例如对不存在的平台函数的引用)。

关于c - 如果0在c程序中编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30188326/

相关文章:

c - 警告 : assignment from incompatible pointer type for a 2D array pointer

c - 解析引用在链接器/编译器中意味着什么?

c - c语言中这两种语法有什么区别?

c - 通过 C 中的 Netlink 从内核到用户空间的多播

C++:要包含在多个cpp文件中的类中的静态变量

java - 编译器对泛型方法的空参数的行为不同

compilation - 无法为代码::Blocks编译wxWidgets

c++ - 在我的 Mac OSX El Capitan 上编译带有意外错误的简单 C++ 类

c - 格式化字符串并使用 %n 以特定值覆盖内存地址

c - 深层复制 - void** 的元素 - 结构体成员