我正在阅读外部C代码,我找到了以下代码行:
#define __MAIN_C__
其中#define
只有一个"参数" (即__MAIN_C__
)。
这只是一个占位符,还是它有功能?
答案 0 :(得分:3)
#define
会将__MAIN_C__
定义为无值(感谢n.m.和一个简单的测试程序)。当你不关心它所定义的内容时,你需要#define
d这是一个捷径。在这种情况下,在代码中的某个地方,您可能只看到:
#ifdef __MAIN_C__
这并不关心它具有什么特定价值,只要它被定义(也许是非零)。
您经常会在include guards看到这个,就像这样:
#ifndef MYHEADER_H
#define MYHEADER_H
// stuff here
#endif
这类似于在编译标志中执行此操作:
gcc -D__MAIN_C__ main.c
如果你想看到它被定义为空,请尝试编译它并观察它失败:
#include <stdio.h>
#define TEST
int main(int argc, char *argv[])
{
printf("%d\n", TEST);
return 0;
}
答案 1 :(得分:1)
是的,这可以完成一些事情。如果你看,有一个相当不错的机会,你可以找到类似于:#ifdef __MAIN_C__
的地方 - 这只是检查符号是否已被定义,无论给定的值(如果有的话)。
答案 2 :(得分:1)
在这种情况下,定义只需设置 MAIN_C 。没有赋值,但预处理器会将 MAIN_C 插入为“true”。通常,这些定义用于在编译之前包含或排除代码,使用类似下面的内容:
#define WIN32
#ifdef WIN32
//some win32-specific code
#else
//some other code
#endif
答案 3 :(得分:0)
这个定义使__MAIN_C__
扩展(粗略地说)为零。
可能的用途:
#ifdef __MAIN_C__
foo(bar);
#endif
另一个:
#ifdef PLAIN_OLD_OS
#define __MAIN_C__
#else
#define __MAIN_C__ __os_specific_attribute(dllsomething)
#endif
__MAIN_C__ int main (int argc, char* argv[]) {