我找到了一些代码行,这些代码在 C 的源代码预处理器块中变暗。我的编译器,MS Visual Studio,命名它"非活动预处理器块"。这是什么意思,我的编译不会考虑这些代码行, 以及如何使其成为活动块?
答案 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的屏幕截图。红色的行被禁用代码。
希望这会有所帮助。
答案 2 :(得分:1)
预处理器是程序翻译的最早阶段之一。它可以在编译阶段开始之前修改程序的源代码。这样,您可以根据各种约束将源配置为不同的构建。
预处理器条件块的使用包括:
完全评论代码:
#if 0
// The code here is never compiled. It's "commented" away
#endif
根据各种约束提供不同的实现,例如platfrom
#if defined(WIN32)
//Implement widget with Win32Api
#elif defined(MOTIF)
// Implement widget with Motif framework
#else
#error "Unknown platform"
#endif
让像assert
这样的宏以不同的方式运作。
确保正确定义有用的抽象:
#if PLATFORM_A
typedef long int32_t;
#elif PLATFORM_B
typedef int int32_t;