编译器:如果条件总是为真/假,该怎么办?

Mar*_*ský 13 c c++ gcc if-statement arduino

我想到条件和编译器.我正在编写Arduino的应用程序,所以我需要尽可能快的应用程序.

在我的代码中我有这个:

#define DEBUG false    

...

if (DEBUG)
{
  String pinName;
  pinName = "Pin ";
  pinName += pin;
  pinName += " initialized";
  Serial.println(pinName);
}
Run Code Online (Sandbox Code Playgroud)

我想知道编译器是否在二进制文件中不包含代码(if块中的代码).条件总是错误的,所以程序永远不会去那里.

从另一方面来看.如果DEBUG是真的怎么办?Arduino是否测试条件或编译器只包含if在二进制文件中的主体?

我发现这个网站https://gcc.gnu.org/onlinedocs/gcc-3.0.2/cpp_4.html关于#if指令,所以我可以重写代码以获得这些指令而不是"正常"if.但我想知道我是否应该重写它,或者是否浪费时间.

Lun*_*din 10

任何半好的优化编译器都会删除if语句中的整个代码,如果它可以在编译时告诉条件总是求值为false.类似地,如果条件总是为真,那么任何半正式编译器都会跳过检查本身.

实际上,这完全等同于"编译器开关",例如:

#define DEBUG


#ifdef DEBUG
...
#endif
Run Code Online (Sandbox Code Playgroud)

#ifdef更喜欢"编译器切换"语法,因为它使其他C程序员的意图更清晰.但这只是编码风格的问题 - 它将产生与原始代码相同的二进制文件.