【问题标题】:Difference between using an if statement vs a #if statment使用 if 语句与 #if 语句之间的区别
【发布时间】:2012-09-17 03:55:25
【问题描述】:

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

这是您使用#ifdef 语句的正确方式吗?

#define variable 1

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

【问题讨论】:

    标签: c syntax if-statement


    【解决方案1】:

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

    【讨论】:

    • 所以我需要在主代码运行之前定义变量吗?例如,我使用“#define variables.....”(我在其中定义全局变量)然后在我的 main() 函数中运行代码?
    • @user1697752 不,它们并不是真正的变量。如果您 #define 一个“变量”并在您的普通代码中使用它,预处理器将用您定义它的值替换该名称的实例。因此,在您的示例中,到处都使用了variable,它将被替换为文字数字1,供编译器使用。这就是为什么它不能用作变量,例如不能分配给文字数字。
    【解决方案2】:

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

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

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

    【讨论】:

    • 所以你不能像我之前那样在代码中定义它?例如,它必须预先确定并特定于开发套件的配置。
    • 不,如果你愿意,你可以自己定义。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      #ifdef ...
      

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

      if (...)
      

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


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

      【讨论】:

      • 在某些情况下if#if 几乎相同,但这取决于编译器的聪明程度。 if (false) 或等效项通常会跳过该块,但该块内的语法错误仍会导致编译失败。使用#if 他们不会。
      【解决方案5】:

      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` 代码添加到项目中,您会注意到当您切换到发布模式(假设所有默认设置)时,其中的代码会“变灰”一点。这是 Visual Studio 说的,当你编译时,灰色的代码不会在当前配置中运行。

      【讨论】:

        【解决方案6】:

        我们# 的所有行都由编译器(gcc)处理。并且不在二进制(运行时)中处理

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

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

            代码 1 -

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

            代码 2 -

            #ifdef SOMETHING
                do_some_c_stuff();
            #endif
            
            1. 如果定义了“SOMETHING”(真或假),我们将调用 do_some 函数
            2. 如果您的代码库中未定义“SOMETHING”,则不会编译此代码

            这就是为什么你会经常看到:

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

            或两者的组合

            【讨论】:

            • 如果SOMETHING没有定义,在#if SOMETHING中默认为0(false)。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-12
            • 2023-02-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多