2017-05-18 45 views
6

Tôi đã tự hỏi, khi bao gồm tệp tiêu đề, độ sâu của tệp bao gồm có tăng không giới hạn không? Bạn có thể chỉ định giới hạn tại thời gian biên dịch không?Tiêu đề bao gồm Giới hạn chiều sâu

Ví dụ:

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) 

Tôi thích hợp? Các tệp tiêu đề có thể được bao gồm vô tận không?

+1

Câu hỏi liên quan đến C++: http://stackoverflow.com/questions/12125014/are-there-limits-to-how-deep-nesting-of-header-inclusion-can-go. Một trong những câu trả lời đưa ra một trích dẫn từ tiêu chuẩn C++ như đề xuất, nhưng không nhất thiết yêu cầu, hỗ trợ cho ít nhất 256 lồng nhau bao gồm. Nhiều triển khai hỗ trợ làm tổ sâu sắc hơn nhiều. –

Trả lời

4

Có giới hạn khác dựa trên trình biên dịch.

Từ phần 6.10.2 của [C chuẩn]) (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf):

6 A #include preprocessing directive may appear in a source file that has been read because of a #include directive in another file, up to an implementation-defined nesting limit (see 5.2.4.1).

Mục 5.2.4.1:

The implementation shall be able to translate and execute at least one program that contains at least one instance of every one of the following limits:

...

  • 15 nesting levels for #included files

Vì vậy, các tiêu chuẩn quốc gia mà việc triển khai phù hợp phải hỗ trợ ít nhất 15 cấp độ sâu, nhưng có thể nhiều hơn.

Trong thực tế, bạn có thể sẽ không đạt giới hạn như vậy trừ khi bạn kết thúc với một vòng lặp trong các tệp bao gồm của bạn.

Ví dụ, nếu bạn làm điều này:

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 sẽ cung cấp cho bạn các lỗi sau:

error: #include nested too deeply

Trong trường hợp của tôi (gcc 4.8.5) , nó đã đi khoảng 200 cấp độ sâu trước khi nó bị lỗi. Xem the gcc preprocessor manual, section 11.2 để biết chi tiết.

Đối với MSVC, nó hỗ trợ độ sâu bao gồm 10 (see here). Lưu ý rằng điều này có nghĩa là (trong số các lý do khác) rằng MSVC không phải là trình biên dịch phù hợp tiêu chuẩn.

+0

Tôi đã tự hỏi tác động nào sẽ '#pragma once' có trong việc ngăn chặn lặp? – ryyker

+0

@ryyker Có nó sẽ.Tương tự như bao gồm bảo vệ ('#ifndef X #define X # endif'), miễn là bạn đưa vào bên trong chúng, mà bạn nên làm. –

Các vấn đề liên quan