头文件包含深度限制

6
我想知道,当包含头文件时,嵌套深度是否可以无限增加?在编译时能否指定一个限制?
例如:

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 )

我说得对吗?头文件可以无限制地包含吗?


1
一个关于C++的相关问题:https://dev59.com/GmfWa4cB1Zd3GeqPjbGZ。其中一个答案引用了C++标准中的一句话,建议但不一定要求支持至少256个嵌套包含。许多实现支持更深的嵌套。 - Jim Lewis
1个回答

4

根据编译器的不同,有一个限制。

来自[C标准](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)第6.10.2节:

6一个#include预处理指令可以出现在已经因为另一个文件中的#include指令而被读取的源文件中,最多到一个实现定义的嵌套限制(见5.2.4.1)。

第5.2.4.1节:

实现应能够翻译和执行至少包含以下每个限制的至少一个实例的程序:

...

  • 15个#included文件的嵌套级别

因此,标准规定符合要求的实现必须支持至少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会报以下错误:

error: #include nested too deeply

在我的情况下(gcc 4.8.5),它嵌套了大约200个级别才出现错误。请参见gcc预处理器手册,第11.2节获取详细信息。

对于MSVC,它支持10个包含深度(在这里查看)。请注意,这意味着(除其他原因外)MSVC不是符合标准的编译器。


我在想,#pragma once对于防止循环有什么影响? - ryyker
@ryyker 是的,它会。与包含保护 (#ifndef X #define X #endif) 相同,只要您将包含放在其中,而您应该这样做。 - J_S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接