使用if语句与#if语句之间的区别

时间:2012-09-25 15:29:01

标签: c syntax if-statement

我想知道使用if语句与#if#ifdef语句是否是一种风格问题,或者功能上存在差异以及为什么要使用其他语句。

这是使用#ifdef声明的正确方法吗?

#define variable 1

#ifdef variable      //if variable is defined as 1?
//code
#endif

8 个答案:

答案 0 :(得分:2)

#if由预处理器使用,用于有条件地包含用于编译的代码段。一个典型的用法是必须为不同的操作系统(或不同的编译器)编译源文件:

#ifdef _WIN32
/* Something specific to windows. */
#else
/* Something not available on windows. */
#endif

if语句用于在运行时控制程序流。

答案 1 :(得分:1)

所有以#为前缀的指令由编译器编译之前运行的编译器的一部分处理,称为preprocessor。也就是说,对于示例中的代码,如果未定义variable,编译器甚至不会看到#ifdef#endif之间的代码。

答案 2 :(得分:1)

这两个语句由编译器的两个不同阶段执行:

#ifdef ...

由预处理器执行。它删除或保留完整的守卫部分代码。这是在编译时完成的,因此条件必须是编译时常量。如果#ifdef排除了部分代码,则相应的代码不会进入已编译的可执行文件。

if (...)

由编译器处理,并转换为可执行代码。它的表达式可以在运行时计算。表达式的两面都保留在已编译的可执行文件 *


* 除非优化器检测到可以删除一个部件;这并不常见。

答案 3 :(得分:1)

这种区别有一个重要原因:

代码1 -

#if SOMETHING
    do_some_c_stuff();
#endif
  1. 如果“SOMETHING”为真,我们将调用do_stuff函数
  2. 如果“SOMETHING”为false,则不会编译此代码。
  3. 如果您的代码库中未定义“SOMETHING”,则不进行编译。
  4. 代码2 -

    #ifdef SOMETHING
        do_some_c_stuff();
    #endif
    
    1. 如果定义了“SOMETHING”(真或假),我们将调用do_some函数
    2. 如果您的代码库中未定义“SOMETHING”,则不会编译此代码
    3. 这就是为什么你经常会看到:

      #ifdef SOMETHING
      #if SOMETHING
          do_some_c_stuff();
      #endif
      #endif
      

      或其某些组合

答案 4 :(得分:0)

#ifdef由编译器预处理,这意味着表达式不会在运行时计算。它通常用于检查编译标志。

答案 5 :(得分:0)

http://msdn.microsoft.com/en-us/library/4y6tbswk(v=vs.100).aspx

Cliffs:它在编译时评估#if,并根据结果,它在#if ... #endif内的代码块中执行代码。常用:

#if DEBUG
    // Do some additional logging here we don't want to to in release.
#endif

如前所述,您无权访问本地变量,预处理程序指令可以访问您定义的内容。默认情况下,在Visual Studio中,当您将模式设置为DEBUG时,会定义Debug。如果将上面的#if DEBUG代码添加到项目中,当您切换到Release模式时(假设所有默认设置),您会注意到它内部的代码会“灰显”一下。这是Visual Studio,说明编译时灰色代码不会在当前配置中运行。

答案 6 :(得分:0)

编译器(gcc)处理#的所有行。而不是在二进制(运行时)

中处理
  

这是使用#ifdef语句的正确方法吗?    - >是

答案 7 :(得分:0)

#if#ifdef在编译时进行评估,它们是预处理器指令。您在代码中命名为“variable”的项不是变量,而是一个数字常量,它将在代码编译之前用代码替换代码中出现的所有“变量”。所有这些预处理器指令只是指示编译器应如何将代码转换为二进制文件。

普通的if语句完全不同,它是实际程序本身的一部分,执行运行时检查,从而控制程序的“流程”。