[英]#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 ,第二个文件的内容都将被忽略。
2就定义MYHEADER
而言,您有几个选择:您可以在C文件,头文件中定义它,或使用C编译器的相应选项从命令行传递它。
因为#define指令具有全局作用域,所以仅使用一个定义,因此第二个include将不起作用。
您应该使用MY_PROJECT_MY_HEADER或类似的东西,以防止发生此类问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.