23

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

如果我使用#if而不是对我的代码有什么影响if

哪个更好用,为什么?

4

5 回答 5

45

if并且#if是具有不同目的的不同事物。

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

如果您使用预处理器的#if,则在编译时评估条件(最初这是编译时之前,但现在预处理器通常是编译器的一部分),并且错误分支的代码包含在编译程序中. 条件只能基于编译时信息(如#define常量等)。#if用于为不同的编译时环境提供不同的代码(例如,在 Windows 和 *nix 上编译的不同代码,诸如此类)。

于 2013-05-08T10:51:33.873 回答
15

我们不能说哪个更好用,因为一个用于编译阶段(#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");
*/

}
于 2013-05-08T10:51:01.723 回答
7

嘿,两者都不一样

  1. #if在编译时测试条件是否为真。
  2. if在运行时评估。
于 2013-05-08T10:56:38.563 回答
4

当条件的结果在编译时已知时,您应该使用#if,如果直到运行时才知道结果,则应该使用常规。

#if DEBUG

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

if (date == DateTime.Today)

取决于今天是什么日子

于 2013-05-08T10:51:35.803 回答
2

的一些用途#if是:

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

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

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

例子:

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

#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
于 2013-05-08T11:19:59.553 回答