"if"和"#if"; 哪一个更好用

Ank*_*lon 23 c if-statement

我了解到if或者#if都可以用于条件检查.由于我们可以检查条件if,我们为什么要使用预处理器#if

如果我用#if而不是代码,我的代码会有什么不同if

哪一个更好用,为什么?

T.J*_*der 38

if并且#if是不同目的的不同事物.

如果使用该if语句,则在运行时评估条件,并且两个分支的代码都存在于已编译的程序中.条件可以基于运行时信息,例如变量的状态.if用于程序中的标准流量控制.

如果使用预处理程序#if,则在编译时评估条件,并且编译程序中包含false分支的代码.条件只能基于编译时信息(例如#define常量等).#if是为不同的编译时环境提供不同的代码(例如,在Windows与*nix上编译的不同代码,这类事情).


MOH*_*MED 13

我们不能说哪个更好用,因为一个用于编译阶段(#if)而另一个用于运行时阶段(if)

#if 1
   printf("this code will be built\n");
#else
   printf("this code will not\n");
#endif
Run Code Online (Sandbox Code Playgroud)

尝试构建上面的代码,gcc -E您将看到您的编译器将生成另一个仅包含以下内容的代码:

printf("this code will be build\n");
Run Code Online (Sandbox Code Playgroud)

另一个printf将不会出现在新代码(预处理器代码)中,然后在程序二进制文件中不存在.

结论:#if在编译阶段进行处理,但在if程序运行时处理正常情况

您可以#if 0在代码的一部分中使用,以避免编译器编译它.就像你评论过这一部分一样

int main(void) {

       printf("this code will be build\n");
#if 0
       printf("this code will not\n");
#endif

}
Run Code Online (Sandbox Code Playgroud)

它相当于

int main(void) {

       printf("this code will be built\n");
/*
       printf("this code will not\n");
*/

}
Run Code Online (Sandbox Code Playgroud)


Nee*_*bey 6

嘿,两者都不一样

  1. #if 测试编译时条件是否为真.
  2. if 在运行时评估.