2012-08-25 38 views
6

Tôi không thể tìm thấy bất cứ điều gì trên MSDN hoặc ở nơi khác, nhưng có giới hạn mã hóa cứng để làm thế nào sâu làm tổ bao gồm tiêu đề có thể đi? Ví dụ:Có giới hạn về cách lồng ghép sâu bao gồm tiêu đề có thể đi không?

// H1.h 
// guards etc. 
#include "H2.h" 

// H2.h 
// guards etc. 
#include "H3.h" 

//... 

// HN.h <---- how large can N get?? 

Tôi tự hỏi nếu có bất kỳ điều gì trong Tiêu chuẩn về điều này. Nếu câu trả lời được thực hiện được xác định, thì tôi chủ yếu quan tâm đến chuỗi công cụ Visual Studio.

+3

Thật dễ dàng để tìm ra. Chỉ cần có một tập tin bao gồm chính nó, và xem khi nó lỗi. Bạn có thể sử dụng '# warning' để buộc tiêu đề in nội dung gì đó ra ngoài, nếu thông báo lỗi không có chiều sâu. Ví dụ, Clang dừng lại ở mức 200. –

Trả lời

6

Tiêu chuẩn cũng nói điều gì đó về nó (một phần về số lượng thực hiện, phụ lục B):

Các giới hạn có thể hạn chế số lượng bao gồm các đại lượng được mô tả bên dưới hoặc các thiết bị khác. Số ngoặc đơn sau mỗi số lượng được đề nghị là là số lượng tối thiểu cho số lượng đó. Tuy nhiên, những số lượng này chỉ là các nguyên tắc và không xác định sự tuân thủ.

...

  • mức lồng nhau cho các tập tin #include [256].

Lưu ý rằng đây chỉ là một tối thiểu đề nghị, do đó, một trình biên dịch có thể không hỗ trợ nhiều thể vùi (nhưng hầu hết các trình biên dịch làm gì, như thể hiện trong câu trả lời khác).

+0

+1 cho báo giá Tiêu chuẩn và được chấp nhận. Đây là những gì tôi đang tìm kiếm. – TemplateRex

3

Từ MSDN for Visual Studio 2012:

làm tổ của bao gồm các file có thể tiếp tục lên đến 10 cấp độ.

CẬP NHẬT:

Giới hạn này "chính thức" có lẽ là nhiều hơn một phương châm để mọi người sẽ không bắt đầu để ngăn xếp bao gồm các file không có lý do. Tôi không tin rằng đã có một trình biên dịch với giới hạn bao gồm hạn chế cho một vài thập kỷ ít nhất.

Ví dụ, theo một trong các câu trả lời khác ít nhất một phiên bản của trình biên dịch VS C++ hỗ trợ khoảng 1024 mức lồng nhau.

+2

Trình biên dịch C++ của VS rất khó so với các trình biên dịch khác –

+1

@ Mr.Anubis: Tôi nghi ngờ giới hạn "chính thức" này thực sự là một hướng dẫn để mọi người không bắt đầu ngăn xếp bao gồm các tệp không có lý do.Giới hạn thực tế có thể cao hơn rất nhiều - mặc dù điều đó không làm cho trình biên dịch VS C++ hút thêm bất kỳ ... – thkala

+0

"Tôi nghi ngờ giới hạn" chính thức "này thực sự là một hướng dẫn để mọi người không bắt đầu ngăn xếp các tập tin không có lý do "Tôi không lý do tại sao mọi người sẽ làm điều đó trong các dự án của họ mà không có bất kỳ lý do hợp lý –

4

Có: 200. Ít nhất cho phiên bản gcc của tôi.

Nó có thể dễ dàng kiểm tra:

#!/bin/bash 

i=0 

touch "test$i.c" 

while gcc -c "test$i.c"; do 
    j="$[ $i + 1 ]" 
    echo "#include \"test$i.c\"" > "test$j.c" 
    i="$j" 
    echo "$j" | grep -q "000$" && echo "$j are fine" 
done 

này sản lượng:

In file included from test2.c:1:0, 
      from test3.c:1, 
      from test4.c:1, 
      ... 
      from test198.c:1, 
      from test199.c:1, 
      from test200.c:1: 
test1.c:1:19: error: #include nested too deeply 
6

Tôi đã viết một tập tin tiêu đề đó bao gồm chính nó và biên dịch nó với MSVS 2010. Điều đó đã cho thông báo lỗi:

fatal error C1014: too many include files : depth = 1024 
+0

jeez !! MSDN MS thậm chí không được cập nhật, xem câu trả lời của @ thkala –

+0

+1 Cảm ơn. Tôi không nghĩ đến việc tự bao gồm để kiểm tra giới hạn. – TemplateRex

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