Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译器开关还是预处理器开关?_C++_C Preprocessor - Fatal编程技术网

C++ 编译器开关还是预处理器开关?

C++ 编译器开关还是预处理器开关?,c++,c-preprocessor,C++,C Preprocessor,使用预处理器切换代码非常常见: #define MY_SWITCH (1) #if MY_SWITCH cout << "on" << Test(1); #else cout << "off" << Test(2); #endif #定义MY_开关(1) #如果我的开关 您不能保证编译器优化。(如果您希望对C进行经过验证的优化,请查看) 然而,在这种情况下,大多数编译器都会进行优化,有些编译器甚至会对死代码发出警告。尝试使用最近的或启

使用预处理器切换代码非常常见:

#define MY_SWITCH (1)
#if MY_SWITCH
   cout << "on" << Test(1);
#else
   cout << "off" << Test(2);
#endif
#定义MY_开关(1)
#如果我的开关
您不能保证编译器优化。(如果您希望对C进行经过验证的优化,请查看)

然而,在这种情况下,大多数编译器都会进行优化,有些编译器甚至会对死代码发出警告。尝试使用最近的或启用了优化(例如
g++-Wall-Wextra-O2

此外,我相信大多数编译器不会在生成的优化代码执行时消耗资源,但会在编译时消耗资源

也许使用
constexpr
可以帮助一些编译器更好地进行优化


另外,查看生成的汇编代码(例如,使用
g++-O2-fverbose asm-S
)或编译器的中间转储(例如
g++-O2-fdump tree all
,它提供数百个转储文件)。如果使用GCC,您可能会对其进行自定义,例如添加额外的编译时检查。

我几周前就遇到了这个问题-禁用代码库中的一个有问题的诊断功能表明替代代码中有一些新的错误,阻止了编译。然而,我不会按照你建议的路线走

您首先牺牲了使用宏的好处,而不一定获得任何好处。我希望我的编译器能够优化死分支,但你不能依赖它,我觉得宏方法使你的程序有两种不同的“配置”,并且在特定的构建中只能使用一种


我会让您的持续集成系统(或驱动自动构建测试的任何系统)循环各种构建配置组合(在命令行上使用
-D
提供宏,可能是从Makefile或其他构建脚本中,而不是在源代码中硬编码宏)然后对它们进行测试。

任何好的优化编译器都应该删除死分支。有保证吗?不,这意味着标准要求它。大多数编译器会在优化过程中删除未使用的分支吗?是的。你不能为预处理器解决方案测试两个版本吗?是的,我可能可以使用不同配置的项目/目标来解决这个问题。。。但是,如果基于编译器的替代方案可以很好地工作,我可以避免这种努力。+1我喜欢这种循环各种构建配置的连续集成系统,它也有助于处理“祖先”/遗留代码。@P0W:没错。我的意思是,我们已经自动化了调试和发布配置的构建,对吗?那么,为什么不这样做呢?=)目前我们不使用自动构建系统。无论如何,增加替代目标也是一个解决方案。
static const bool mySwitch = true;
if (mySwitch)
{
   cout << "on" << Test(1);
}
else
{
   cout << "off" << Test(2);
}