C (#ifdef)vs.(#define<;boolean>;)

C (#ifdef)vs.(#define<;boolean>;),c,preprocessor-directive,C,Preprocessor Directive,我试图找出以下两种做法中哪种做法最好: #定义测试 //#如果未使用或只是删除,请定义已注释的测试 #定义测试1 #定义测试0//如果未使用 为了可读性,我更喜欢定义一个“布尔”并在一个if中检查它,但我想它不是很有效,因为它没有使用#ifdef,而且在很多月前,每次在一个if中都需要检查它。一些编译器(如果我记得正确的话,是Solaris编译器)不会正确编译使用第一个代码段的代码 但C标准(现在)要求他们这样做,因此,使用第二种方法毫无益处,而第二种方法现在可以被视为特殊的 当然,如果您需

我试图找出以下两种做法中哪种做法最好:

#定义测试
//#如果未使用或只是删除,请定义已注释的测试
#定义测试1
#定义测试0//如果未使用

为了可读性,我更喜欢定义一个“布尔”并在一个
if
中检查它,但我想它不是很有效,因为它没有使用
#ifdef
,而且在很多月前,每次在一个if

中都需要检查它。一些编译器(如果我记得正确的话,是Solaris编译器)不会正确编译使用第一个代码段的代码

但C标准(现在)要求他们这样做,因此,使用第二种方法毫无益处,而第二种方法现在可以被视为特殊的


当然,如果您需要将
测试
作为一个数值,例如在条件检查中,而不是仅仅使用
#ifdef
,那么您需要使用第二种方法。

虽然您不能将
#ifdef
用于第二种情况,您完全可以使用
#if
,这样测试0就不会有额外的运行时成本。顺便说一句,这也意味着您可以有多个不同的测试值,可能对应于不同的日志级别或类似的东西


(根据芭丝谢芭的建议,将我的评论作为答案发布)

虽然第二种情况下不能使用
#ifdef
,但绝对可以使用
#if
,因此测试0不会有额外的运行时成本。顺便说一句,这也意味着你可以有多个不同的测试值,可能对应于不同的日志级别或类似的东西,这正是我可以有的情况。谢谢您的回答。@FelixG:请输入一个答案,以便OP能够接受?第一种方法的另一个好处是,工具链允许您从外部定义常量;通常,使用“-DDEBUG”来启用调试选项而不必修改文件。那是大约400个月前的事了,所以我不确定它是否相关。此外,早期的Solaris机器可能有一条BFM指令,而新计算机则没有(满月上的分支)。许多月前,一些编译器(如果我记得正确的话,一个用于Solaris)可能早于C89,所以“许多月”是30多年前的事了。我记得当“ANSI”标准出台时,Sun编译器的
-ANSI
参数会破坏许多先前存在的代码。@Lundin,就在10年前,在一家大型投资银行,我不得不支持一个需要第二种方法的编译器,因此我相信它仍然有足够的相关性,可以在这里指出这种可能性。我在修改编译器之前离开了。