繁体   English   中英

#include预处理器宏名称空间

[英]#include preprocessor macro name space

这个问题是为了理解头文件包含的标准行为(而不是在我的编译器上实现的行为)。

我有两个名称相同的头文件(但内容不同):

1) /user/include/myheader.h  # In standard system folder
2) /private/myheader.h       # In my private folder

假设两个标头都包含相同的多个包含预防宏

#ifndef MYHEADER
#define MYHEADER
...
#endif

我有C文件/private/test.c ,其中包括上述两个标头:

#include <myheader.h>  // Includes from standard system folder
#include "myheader.h"  // Includes from the folder where test.c is present

由于每个MYHEADER定义都有单独的名称空间,因此在预处理时,两个文件中的内容是否都进入C文件中? 还是因为在同一名称空间中已经定义了MYHEADER,所以将防止第二个包含?

所有宏只有一个名称空间,所有宏都位于同一个名称空间中。 将内容放入不同的头文件中对此没有影响-它们都仍位于相同的名称空间中。 因此,在您的示例中,第一个标头将定义MYHEADER ,这将导致(有效)忽略第二个标头。

N1570

6.10.3宏替换

...
7紧随define之后的标识符称为宏名称 宏名称只有一个名称空间。 对于任何一种形式的宏,预处理令牌替换列表之前或之后的任何空格字符均不视为替换列表的一部分。

强调我的。

按照书面规定,仅第一个myheader.h文件的内容将被处理。

C标准1中没有用于预处理程序定义的“名称空间”之类的东西。 MYHEADER定义MYHEADER 2 ,第二个文件的内容都将被忽略。


1 C99标准的第6.2.3节定义了四个名称空间-(1)用于标签,(2)用于struct / union / enum标签,(3)用于每个结构或联合的成员,以及(4)其他所有内容。 预处理程序定义不属于任何这些名称空间,因为“此处不再考虑宏名称和宏参数,因为在程序翻译的语义阶段之前,源文件中所有出现的宏名称都将被预处理令牌序列替换。构成它们的宏定义。”。

2就定义MYHEADER而言,您有几个选择:您可以在C文件,头文件中定义它,或使用C编译器的相应选项从命令行传递它。

因为#define指令具有全局作用域,所以仅使用一个定义,因此第二个include将不起作用。

您应该使用MY_PROJECT_MY_HEADER或类似的东西,以防止发生此类问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM