什么意思是"不活跃" C中的预处理程序块?

时间:2017-02-01 06:44:32

标签: c visual-studio-2010 c-preprocessor

我找到了一些代码行,这些代码在 C 的源代码预处理器块中变暗。我的编译器,MS Visual Studio,命名它"非活动预处理器块"。这是什么意思,我的编译不会考虑这些代码行, 以及如何使其成为活动块?

3 个答案:

答案 0 :(得分:6)

非活动预处理程序块是由于预处理程序指令而停用的代码块。最简单的例子是:

#if 0
//everytyhing here is inactive and will be ignored during compilation
#endif

更常见的例子是

#ifdef SOME_VAR
// code
#else
// other code
#endif

在这种情况下,第一个或第二个代码块将处于非活动状态,具体取决于是否定义了SOME_VAR

答案 1 :(得分:1)

请检查为创建您的问题而创建的假设示例。

#include <iostream>
#include <windef.h>

#define _WIN32

int add(int n1, int n2){return n1 + n2;}

LONGLONG add(LONGLONG n1, LONGLONG n2){return n1 + n2;}

int _tmain(int argc, _TCHAR* argv[])
{
#ifdef _WIN32
    int val = add(10, 12);
#else
    LONGLONG = add(100L, 120L);//Inactive code
#endif // _WIN32
    return 0;
}

您可以看到_WIN32被定义为#else预处理器指令中的代码被禁用且不会被编译。您可以取消定义_WIN32以查看反向操作。请参阅附加的MS Visual Studio的屏幕截图。红色的行被禁用代码。

enter image description here

希望这会有所帮助。

答案 2 :(得分:1)

预处理器是程序翻译的最早阶段之一。它可以在编译阶段开始之前修改程序的源代码。这样,您可以根据各种约束将源配置为不同的构建。

预处理器条件块的使用包括:

  1. 完全评论代码:

    #if 0
    // The code here is never compiled. It's "commented" away
    #endif
    
  2. 根据各种约束提供不同的实现,例如platfrom

    #if defined(WIN32)
      //Implement widget with Win32Api
    
    #elif defined(MOTIF)
      // Implement widget with Motif framework
    
    #else
      #error "Unknown platform"
    #endif
    
  3. 让像assert这样的宏以不同的方式运作。

  4. 确保正确定义有用的抽象:

    #if PLATFORM_A
      typedef long int32_t;
    #elif PLATFORM_B
      typedef int  int32_t;