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
Đố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.
Tôi chưa bao giờ nghe nói về bất kỳ ai sắp hết. Không bao giờ.
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.
"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ý. –
@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ổ. –
đồ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. –
- 1. Giới hạn thực tế về số lượng các phiên bản FileSystemWatcher mà máy chủ có thể xử lý là gì?
- 2. Có giới hạn về số lượng mô-đun mà WinDbg có thể thấy không?
- 3. Số lượng bộ xử lý MPI?
- 4. Chạy bộ xử lý trước "ánh sáng" cho GCC
- 5. Đa xử lý Python: làm cách nào để giới hạn số lượng quy trình chờ?
- 6. Bộ vi xử lý Intel và AMD có cùng bộ xử lý không?
- 7. cách giới hạn số lượng ký tự trong một trường xử lý văn bản php?
- 8. Gcc có thể xuất mã C sau khi xử lý trước không?
- 9. Công cụ xử lý trước C# có tồn tại không?
- 10. Có giới hạn về số lượng cuộc gọi urlfetch không đồng bộ mà tôi có thể chạy đồng thời không?
- 11. EHsc vc EHa (xử lý ngoại lệ không đồng bộ và không đồng bộ)
- 12. Làm thế nào để bạn có được Số lượng Xử lý Cửa sổ Hiện tại và Hạn chế Xử lý Cửa sổ trong .NET?
- 13. Xử lý các giới hạn tốc độ API?
- 14. Trình xử lý ngắt có thể được xử lý bởi cùng một trình xử lý ngắt không?
- 15. Số lượng bộ xử lý trong Clojure? Java interop
- 16. Không có lực lượng xử lý ngoại lệ?
- 17. Có giới hạn về số lượng tác vụ không?
- 18. (Lạ?) Hành vi tiền xử lý GCC
- 19. Xử lý một số lượng lớn các tệp
- 20. Trình xử lý sự kiện có được xử lý không đồng bộ không?
- 21. Xử lý một phần tệp bằng bộ tiền xử lý
- 22. Xử lý số lượng dữ liệu rất lớn trong MyBatis
- 23. tùy chọn gcc cho bộ xử lý ARM iMX6q freescale
- 24. Xử lý không đồng bộ Django
- 25. Tornado xử lý dữ liệu trong bộ xử lý yêu cầu sau khi trả về
- 26. Chiến lược xử lý lỗi và xử lý lỗi
- 27. Có giới hạn về số lượng kênh có thể mở mỗi phiên trong JSch không?
- 28. Có giới hạn về số lượng JSON có thể giữ không?
- 29. Xử lý lỗi STL mà không có ngoại lệ
- 30. Thứ tự mà EnumWindows trả về có xử lý nào không?
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 ... –