2013-03-12 16 views
12
void operator"" test(const char* str, size_t sz ) 
{ 
    std::cout<<str<<" world"; 
} 

int main() 
{ 
    "hello"test; 
    return 0; 
} 

Trong GCC 4.7, điều này tạo ra "cảnh báo: literal hậu tố điều hành không phải do '_' được dành riêng cho tiêu chuẩn trong tương lai [kích hoạt theo mặc định]"Có thể vô hiệu hóa cảnh báo GCC về thiếu dấu gạch dưới trong chữ được người dùng định nghĩa không?

Tôi hiểu tại sao cảnh báo này được tạo ra, nhưng GCC nói " được bật theo mặc định ".

Có thể tắt cảnh báo này mà không cần tắt tất cả cảnh báo qua cờ -w không?

+4

Ồ, tôi không biết rằng C++ 11 hỗ trợ quá tải [toán tử "" "(http://ideone.com/ZDyCML). By the way g ++ hiện tại trong ideone ít nhất là không cảnh báo, nhưng trình biên dịch địa phương của tôi không. Chỉ cần cho thông tin của người khác (những người không biết bối cảnh), bằng cách thay đổi 'test' thành' _test' cảnh báo biến mất. – iammilind

+12

Tại sao bạn muốn? Có khả năng là sau này các phiên bản C++ sẽ bao gồm các ký hiệu có khả năng xung đột. Thật tồi tệ*. Vấn đề của GCC là nó không mang lại cho bạn một lỗi * * theo cách của nó. –

+1

@Nicol, đánh giá cao nhận xét của bạn và cảnh báo này thực sự dẫn đến lỗi cho tôi vì tôi sử dụng -Werror. Chúng tôi có nhiều cảnh báo có giá trị trong GCC nhưng chúng tôi vẫn để người lập trình tắt chúng một cách rõ ràng. – cmeub

Trả lời

4

Sau khi đọc một số nhận xét cho câu hỏi này, tôi đã xem xét tiêu chuẩn C++ 11 (bản nháp không chính thức N3337).

Khi tôi nói "Tôi hiểu tại sao cảnh báo này được tạo" Tôi đã nhầm lẫn. Tôi giả định rằng dấu gạch dưới không được yêu cầu về mặt kỹ thuật theo tiêu chuẩn, nhưng chỉ là một đề xuất (do đó cảnh báo chứ không phải là lỗi).

Nhưng khi Nicol Bolas đã lớn lên, tiêu chuẩn sử dụng ngôn ngữ sau khi nói về người sử dụng định nghĩa chữ: "định suffix Literal mà không bắt đầu với một dấu gạch dưới được dành riêng cho tiêu chuẩn tương lai"

"Một chương trình có chứa hậu tố ud đó không đúng định dạng, không yêu cầu chẩn đoán".

Điều này tương tự như ngôn ngữ được sử dụng cho số nhận dạng dành riêng và "đại diện thay thế" chẳng hạn như "và", "hoặc", "không". Tôi nghĩ rằng điều này làm cho nó khá rõ ràng rằng điều này không thực sự là một cảnh báo ở nơi đầu tiên, nhưng một lỗi.

Đây có thể không phải là câu trả lời trực tiếp cho câu hỏi "có thể vô hiệu hóa" hay không, nhưng đó là câu trả lời đủ cho tôi.

Nicol nếu bạn muốn gửi nhận xét của mình làm câu trả lời, tôi sẽ thay đổi nhận xét của bạn thành câu trả lời được đánh dấu (tôi nghĩ điều đó là có thể).