我想知道,当包含头文件时,包含文件的深度可以无限制地增加吗?你能在编译时指定一个限制吗?
示例:
main.c中:
#include "A.h"
const int xyz = CONST_VALUE;
A.H:
#include "B.h"
B.h:
#include "C.h"
...
...
...
Z.h:
#define CONST_VALUE ( 12345 )
我说错了吗?可以无限地包含头文件吗?
答案 0 :(得分:4)
根据编译器的不同,有一个限制。
来自[C标准]的第6.10.2节)(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf):
6
#include
预处理指令可能出现在由于另一个文件中的#include指令而被读取的源文件中 到实现定义的嵌套限制(见5.2.4.1)。
第5.2.4.1节:
实施应能够翻译和执行至少一个 包含至少一个实例的程序 以下限制:
...
- #included files的15个嵌套级别
因此,标准规定,符合要求的实施必须至少支持15个级别,但可能更多。
在实践中,你可能不会达到这样的限制,除非你的包含文件中有一个循环。
例如,如果你这样做:
main.h:
#include "main.h"
extern int x;
main.c中:
#include <stdio.h>
#include "main.h"
int x = 2;
int main()
{
printf("x=%d\n",x);
return 0;
}
gcc会给你以下错误:
错误:#include嵌套太深
在我的情况下(gcc 4.8.5),它在出错之前大约有200级。有关详细信息,请参阅the gcc preprocessor manual, section 11.2。
对于MSVC,它支持包含深度10(see here)。请注意,这意味着(除其他原因外)MSVC不是符合标准的编译器。