标题包含深度限制

时间:2017-05-18 19:57:08

标签: c header

我想知道,当包含头文件时,包含文件的深度可以无限制地增加吗?你能在编译时指定一个限制吗?

示例:

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 个答案:

答案 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不是符合标准的编译器。