2012-03-13 70 views
1

我读外部的C代码定义,我发现下面的代码行:只有1参数

#define __MAIN_C__ 

其中#define给出仅一个“参数”(即__MAIN_C__)。

这只是一个占位符,还是它可以有一个函数?

+0

你可能想阅读更多的关于[C预处理器(HTTP一点://en.wikipedia。组织/维基/ C_preprocessor)。 – 2012-03-13 16:38:27

+0

应该指出,'__MAIN_C__'不是应用程序使用的合法标识符。它被保留用于执行。 – 2012-03-13 17:09:06

+0

@R:你能提供更多的细节吗? – Randomblue 2012-03-13 17:10:51

回答

3

#define将定义__MAIN_C__到没有值(感谢n.m.和一个简单的测试程序)。当你不需要关心它的定义时,这是一个快捷方式,当你需要某些东西时#defined。在这种情况下,在你的代码的某个地方,你可能只看到:

#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; 
} 
+3

不,它不会是1. – 2012-03-13 16:38:34

+0

@n.m .:它会是什么? – Randomblue 2012-03-13 16:41:46

+0

@ n.m。谢谢,刚刚验证 - 它的字面意思是没有定义,但定义。 – 2012-03-13 16:42:27

1

是的,这可以完成索姆ething。如果你看,有一个相当不错的机会,你会发现这样的:#ifdef __MAIN_C__某处 - 这只是检查符号是否已被定义,无论给定的值(如果有的话)。

1

定义在这种情况下只需设置MAIN_C。没有赋值,但预处理器将MAIN_C作为“true”。一般情况下,像定义这些被用于包括或编译之前排除代码,使用类似以下内容:

#define WIN32 

#ifdef WIN32 
//some win32-specific code 
#else 
//some other code 

#endif 
+0

不,它不会将它设置为1. – 2012-03-13 16:43:32

+0

我知道。我在发布并纠正之后立即意识到了这一点。接得好。 – Fopedush 2012-03-13 16:49:45

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[]) {