2011-01-14 46 views
5

Khi thảo luận về khả năng thiết kế cho một dự án có số lượng lớn các hằng số và các mẫu bit được xác định, câu hỏi đặt ra về việc xử lý trình biên dịch chuẩn có thể xử lý bao nhiêu #defines? Tôi cho rằng đó là một con số rất lớn, nhưng chúng tôi tò mò muốn biết liệu có giới hạn trên thực tế hay không.Có giới hạn về số lượng #defines mà bộ xử lý trước gcc và VC++ có thể xử lý không?

Trả lời

7

Đối với một "biên dịch tiêu chuẩn":

5.2.4.1: "giới hạn dịch"

Việc thực hiện sẽ có thể dịch và thực hiện ít nhất một chương trình có chứa ít nhất một ví dụ của mỗi một trong các giới hạn sau

...

4095 định vĩ mô đồng thời quy định tại một đơn vị dịch thuật tiền xử lý

Lưu ý cách hơi kỳ lạ của phân nhịp yêu cầu. Việc triển khai có thể thỏa mãn điều đó bằng cách có một "chương trình vàng" duy nhất mà họ nhận ra và biên dịch như một trường hợp đặc biệt, mặc dù điều đó tương tự với các tiêu chuẩn gian lận. Trong thực tế, bạn có thể đọc tiêu chuẩn nói rằng nếu việc triển khai của bạn áp đặt giới hạn khác với bộ nhớ khả dụng, thì giới hạn đó nên ít nhất 4095. Ngoài 4095 bạn đang dựa vào hành vi cụ thể trong phạm vi.

Một số trình biên dịch (Microsoft) áp đặt một số giới hạn triển khai nhỏ hơn tiêu chuẩn nói. Chúng được liệt kê ở đâu đó trên MSDN tôi nghĩ, nhưng có thể chỉ cho C++. Theo như C đi, kể từ khi tôi trích dẫn C99 nó có thể không có liên quan đến MSVC anyway.

Đối với GCC và MSVC nói riêng, không quá khó để kiểm tra xem một triển khai cụ thể có áp đặt giới hạn tùy ý hay không, có thể dễ dàng hơn việc tìm kiếm tài liệu :-) Tự động tạo tệp không chứa danh sách dài tuyệt vời #define , xem bộ xử lý tiền xử lý của chúng.

+0

Cảm ơn. Có, tôi có thể sẽ thử thử nghiệm tự động tạo cuối cùng chỉ dành cho grins ... –

2

Tôi chưa bao giờ nghe nói về bất kỳ ai sắp hết. Không bao giờ.

0

Bộ tiền xử lý C không mở rộng #define trước khi chúng thực sự được sử dụng. Vì vậy, trong một thực hiện điển hình giới hạn duy nhất bạn có thể gặp phải là bộ nhớ để lưu trữ tất cả những điều đó. Nhưng bộ nhớ này để lưu trữ các đại diện nội bộ của các macro về cơ bản sẽ là một cái gì đó tỷ lệ thuận với kích thước của các tập tin mà trình biên dịch đọc.

(Vâng, bạn có thể làm nhiều bao gồm các tập tin cũng ...)

Bạn có thể làm nổ tung một tiền xử lý chạy bằng cách mở rộng các macro sâu lồng nhau, tôi đoán. Một cái gì đó như

#define EXP1(X) X X 
#define EXP2(X) EXP1(X) EXP1(X) 
#define EXP3(X) EXP2(X) EXP2(X) 
. 
. 
#define EXP64(X) EXP63(X) EXP63(X) 
EXP64(A) 

nên thực hiện thủ thuật, vì nó cung cấp cho bạn 2^64 bản sao của A hoặc hơn. AFAIR, các định nghĩa macro này thậm chí nằm trong giới hạn mà tiêu chuẩn áp đặt.

+0

"các định nghĩa vĩ mô này ngay cả trong giới hạn mà tiêu chuẩn áp đặt" - không quá nhiều trong "4095 ký tự trong một dòng nguồn logic", tôi nghĩ rằng đề cập đến các dòng sau khi tiền xử lý. –

+0

@Steve: các định nghĩa macro là, nhưng không phải là mở rộng của chúng. Nhưng bạn thậm chí có thể làm 'EXP()', sau đó khoảng trống liền kề {sh | c | w} sẽ được dán lại với nhau, và vẫn biên dịch sẽ phát nổ. –

+0

đồng ý, có thể làm cho bộ tiền xử lý/trình biên dịch hết bộ nhớ mà không vi phạm các giới hạn cụ thể được đề cập trong tiêu chuẩn. –

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