2012-08-31 3 views
8

này biên dịch khi sử dụng clang -std=gnu++11 -c test.cpp:Tại sao mã C++ này biên dịch khi sử dụng clang -std = gnu ++ 11?

void test() { 
    [[random text here]] 
    if (0) { 
    } 
} 

Nhưng điều này mang lại cho lỗi main.cpp:3:1: error: expected statement:

void test() { 
    [[random text here]] 
} 

Nếu tôi biên dịch với clang -std=gnu++11 -S -emit-llvm main.cpp và nhìn vào mã LLVM nó trông giống như dòng [[...]] không có tác dụng:

define void @_Z5testv() nounwind uwtable ssp { 
    ret void 
} 

Mọi ý tưởng tại sao? lỗi hoặc một số cú pháp C++ 11 hoặc cú pháp mở rộng GNU?

Im sử dụng kêu vang từ Xcode 4.4.1 (Apple kêu vang phiên bản 4.0 (tags/Apple/kêu vang-421.0.60) (dựa trên LLVM 3.1svn).

+1

'[[văn bản ngẫu nhiên ở đây]]' Đó có phải là mô tả bằng chữ chính xác những gì bạn đặt trong mã hay là trình giữ chỗ cho nội dung nào đó không? Tôi chỉ muốn làm rõ điều đó. –

+1

không có trình giữ chỗ chính xác là mã nguồn –

Trả lời

10

này được sử dụng cú pháp thuộc tính C++ 11 của. "random text here" do đó được giả định là một thuộc tính, theo đặc tả C++ 11, một thuộc tính có thể sửa đổi nhiều câu lệnh và khai báo. trong một số ; giống như nhiều câu lệnh C++ khác.

Tập hợp các thuộc tính được hỗ trợ bởi triển khai thực hiện được xác định (và Clang không hỗ trợ bất kỳ thuộc tính nào). Thật vậy, nó dường như không phải là để hỗ trợ cú pháp thuộc tính ở tất cả, according to the website). Các thuộc tính không được thực hiện bởi một triển khai cụ thể nên được bỏ qua, đó là lý do tại sao nó không có hiệu lực.

+0

Cảm ơn! Tôi stumbled khi điều này trong một số mã Objective-C++ nơi ai đó đã vô tình gõ '[[NSValue alloc]]' một mình trên một dòng :) –

+1

Clang hỗ trợ cú pháp thuộc tính C++ 11, và thậm chí hỗ trợ một thuộc tính không chuẩn: [ clang :: fallthrough] (http://clang.llvm.org/docs/LanguageExtensions.html#clang__fallthrough). Clang thực sự làm cho một số sử dụng các thuộc tính tiêu chuẩn là tốt. Ví dụ, nó có thể tạo ra một cảnh báo cho một hàm được đánh dấu '[[noreturn]]' mà thực sự trả về, và codegen thực sự bị ảnh hưởng. Tôi tưởng tượng rằng không phải mọi thứ đã hoàn thành nên nó chưa được đánh dấu. – bames53

+0

@ bames53: Thật kỳ lạ, vì trang web của họ chỉ đơn giản là nói "không". Thậm chí không một phần hay gì đó. –