2015-01-07 13 views
9
#include <iostream> gfhgfhgf 
using namespace std; 

int main() { 
    return 0; 
} 

Tại sao đoạn mã này biên dịch? Theo The gcc reference on Include Syntax:Không có lỗi trình biên dịch khi sử dụng các ký tự rác trong #include statement

Đó là lỗi nếu có bất kỳ điều gì (ngoài nhận xét) trên dòng sau tên tệp.

và đó chính xác là những gì đang được thực hiện trong mã.

+0

Trình biên dịch của bạn là gì? Mine ('clang-600.0.51') đưa ra cảnh báo. – NPE

+0

Ngữ pháp tiền xử lý MSVC2013 cũng rõ ràng không cho phép nó: http://msdn.microsoft.com/en-us/library/2scxys89.aspx – Bathsheba

Trả lời

12

Sử dụng -pedantic-errors cờ trong gccclang biến này vào một lỗi see it live:

error: extra tokens at end of #include directive 
#include <iostream> gfhgfhgf 
        ^

đó cho thấy nó là một phần mở rộng.

Nếu chúng ta nhìn vào Interfacing C and TAL In The Tandem Environment họ có một số mã như thế này:

#include <stdlibh> nolist 
        ^^^^^^ 

Vì vậy, cả hai gccclang hỗ trợ thêm các ký tự sau khi bao gồm chỉ thị để hỗ trợ một phần mở rộng cần thiết trên một số nền tảng. Sử dụng -pedantic flags làm gccclang tạo ra một cảnh báo cho các phần mở rộng vi phạm tiêu chuẩn và như đã nói ở trên, bạn có thể sử dụng -pendatic-errors để tắt chức năng này vào một lỗi (tôi nhấn mạnh):

để có được tất cả các chẩn đoán cần thiết theo tiêu chuẩn, bạn nên cũng chỉ định -nhập sai (hoặc lỗi -pantic nếu bạn muốn chúng là lỗi thay vì cảnh báo).

Chúng ta có thể tìm thấy một tài liệu tham khảo cho phần mở rộng nolist trong HP'sC/C++ Programmers guide for NonStop Systrms mà nói:

nolist 
    directs the compiler not to list the contents of the file or sections 
    being included. 
This is an HP NonStop extension to the standard. 

Lưu ý, các draft C++ standard định nghĩa ngữ pháp cho hình thức include trong phần 16.2[cpp .include] như sau:

# include < h-char-sequence> new-line 
Các vấn đề liên quan