“if”和“#if”;哪一个更好用

时间:2013-05-08 10:48:22

标签: c if-statement

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

如果我使用#if代替if,我的代码会有什么不同?

哪一个更好用,为什么?

5 个答案:

答案 0 :(得分:37)

if#if是不同用途的不同内容。

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

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

答案 1 :(得分:13)

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

#if 1
   printf("this code will be built\n");
#else
   printf("this code will not\n");
#endif

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

printf("this code will be build\n");

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

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

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

例如

int main(void) {

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

}

它相当于

int main(void) {

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

}

答案 2 :(得分:6)

嘿嘿都是不同的

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

答案 3 :(得分:4)

在编译时已知条件的结果时应使用#if,如果在运行时之前未知结果,则应使用常规。

#if DEBUG

我知道在编译时我正在进行调试构建

if (date == DateTime.Today)

取决于它是哪一天

答案 4 :(得分:2)

#if的一些用途是:

  • 您希望在构建代码的调试版本时添加额外的打印件或检查
  • 您希望确保编译器不包含两次.h文件
  • 您希望编写将使用不同系统调用的代码,并根据系统编译使用适当的系统调用。

因为在编译时检查了上述所有内容,这意味着:

  • 必须能够在编译时评估条件
  • 生成的代码不包含评估为false的分支,导致代码更小,速度更快,因为每次运行程序时都不会检查条件。

示例:

仅为调试模式添加额外检查:

#define DEBUGLEVEL 2

#if DEBUGLEVEL > 1
   printf("The value of x is: %d", x);
#end if

#if DEBUGLEVEL > 2
   printf("The address of x is: %x", &x);
   ASSERT(x > 100);
#end if

确保标题只包括一次:

#ifndef PERSON_H
#define PERSON_H
   class Person{
        ....
   };
#end if

根据平台拥有不同的代码:

#ifdef WINDOWS
   time = QueryPerformanceCounter(..);
#else
   time = gettimeofday(..);
#endif