#define变量的类型

Jam*_*sev 44 c c-preprocessor

如果我有:

#define MAXLINE    5000
Run Code Online (Sandbox Code Playgroud)

MAXLINE被理解为什么类型?我应该假设它是一个int?我能以某种方式测试吗?

一般来说,如何确定#defineed变量的类型?

tpg*_*114 47

它没有类型.这是一个简单的文本替换.在MAXLINE作为令牌出现的任何地方,文本5000都将被删除.

例如:

int a = MAXLINE;
Run Code Online (Sandbox Code Playgroud)

将值5000放入a.

char *MAXLINE2 = "MAXLINE";
Run Code Online (Sandbox Code Playgroud)

不会导致

char *50002 = "5000";
Run Code Online (Sandbox Code Playgroud)

所以,如果你想要进行类型检查,那么宏不可行.您将需要声明静态常量,这样类型检查由编译器完成.

有关之间差异的信息static,const以及#define,有许多来源,包括这样的问题:静态,定义,和const用C


And*_*mbe 9

(非常!)从广义上讲,您的C编译器在执行时将执行3个任务:

  1. 对源文件运行预处理传递,

  2. 在预处理的源文件上运行编译器

  3. 在生成的目标文件上运行链接器.

以a开头#的行,就像行一样


#define MAXLINE    5000
Run Code Online (Sandbox Code Playgroud)

由预处理器阶段处理.(简单地说)预处理器将解析文件并对它检测到的任何宏执行文本替换.预处理器中没有类型的概念.

假设您的源文件中包含以下行:


#define MAXLINE    5000
int someVariable = MAXLINE;     // line 2
char someString[] = "MAXLINE";  // line 3
Run Code Online (Sandbox Code Playgroud)

预处理器将检测第MAXLINE2行上的宏,并执行文本替换.请注意,第3行"MAXLINE"不会被视为宏,因为它是字符串文字.

预处理器阶段完成后,编译阶段将只看到以下内容:


int someVariable = 5000;        // line 2
char someString[] = "MAXLINE";  // line 3
Run Code Online (Sandbox Code Playgroud)

(为了清楚起见,留下了注释,但通常由预处理器删除)您可以使用编译器上的选项来检查预处理器的输出.在gcc中,该-E选项将执行此操作.

请注意,虽然预处理器没有类型的概念,但没有理由不能在宏中包含类型以保证完整性.例如


#define MAXLINE    ((int)5000)
Run Code Online (Sandbox Code Playgroud)


小智 5

编译器永远不会看到那行代码,预处理器在实际编译之前运行,并用它们的文字值替换这些宏,请参阅下面的链接以获取更多信息

http://www.cplusplus.com/doc/tutorial/preprocessor/