2011-09-23 27 views
30

GNU C++ biên dịch dường như để xác định __cplusplus1Gnu C++ macro __cplusplus phù hợp với tiêu chuẩn?

#include <iostream> 
int main() { 
    std::cout << __cplusplus << std::endl; 
} 

này in 1 với gcc trong tiêu chuẩn C++ chế độ, cũng như trong C++ 0x chế độ, với gcc 4.3.4 và gcc 4.7.0.

C++ 11 FDI nói trong "16.8 tên macro Predefined [cpp.predefined]" rằng

Tên __cplusplus được định nghĩa với giá trị 201103L khi soạn thảo một đơn vị dịch thuật C++. (Chú thích: Người ta dự định rằng các phiên bản tương lai của tiêu chuẩn này sẽ thay thế các giá trị của macro này với một giá trị lớn không phù hợp với tạp pilers nên sử dụng một giá trị với ít nhất năm chữ số thập phân..)

Các cũ std C++ 03 đã có một quy tắc tương tự.

GCC có cố tình đặt cài đặt này thành 1, vì nó "không phù hợp" không?

Bằng cách đọc qua danh sách đó, tôi nghĩ rằng tôi có thể sử dụng __cplusplus để kiểm tra một cách di động nếu tôi có trình biên dịch được bật C++ 11. Nhưng với g ++ điều này dường như không hoạt động. Tôi biết về macro ...EXPERIMENTAL..., nhưng đã hiểu được lý do tại sao g ++ đang xác định __cplusplus theo cách này.

Vấn đề ban đầu của tôi đã chuyển đổi giữa các biến thể con trỏ null khác nhau. Một cái gì đó như thế này:

#if __cplusplus > 201100L 
# define MYNULL nullptr 
#else 
# define MYNULL NULL 
#endif 

Có một cách đơn giản và hợp lý xách tay để thực hiện một chuyển đổi như vậy?

+13

Lưu ý phụ: Tôi chưa đọc đầy đủ chủ đề này, nhưng điều này được xác nhận là lỗi trong g + + (10 năm trước!) và được sửa trong 4.7.0: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 – birryree

+0

Làm thế nào về '#ifndef nullptr'' #define nullptr NULL' '# endif' hoặc' #ifdef nulldr' '#define MYNULL nullptr'' # else' '#define MYNULL NULL'' # endif' –

Trả lời

28

Điều này đã được khắc phục khoảng một tháng trước (đối với gcc 4.7.0). Báo cáo lỗi tạo ra một nội dung thú vị: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773

+0

Whow, tôi đã cập nhật cây svn tuần trước, nhưng không chạy mã thử nghiệm trên trình biên dịch * đó *. Chờ đã ... Có, bạn đã đúng! gcc-4.7.0 từ tuần trước: './define-cplusplus.x 199711' – towi

+3

+1 cho liên kết báo cáo lỗi. Rất thú vị. – Joe

+1

Lỗi đã được mở trong hơn 10 năm ... Thật thú vị khi đọc. – Richard

0

Đây là lỗi g + rất cũ.

Tức là trình biên dịch không phù hợp.

Rõ ràng nó không thể sửa được vì sửa chữa nó sẽ phá vỡ một thứ gì đó trên nền tảng điên rồ.

EDIT: oh, tôi thấy từ nhận xét của @ birryree vừa được sửa, trong phiên bản 4.7.0. Vì vậy, nó không phải là không thể sửa chữa sau khi tất cả. Heh.

Chúc mừng & hth.

0

Nếu tôi nhớ chính xác điều này, việc này phải thực hiện với Solaris 8 gây ra sự cố khi __cplusplus được đặt là đúng. Nhóm gcc đã quyết định vào thời điểm đó để hỗ trợ nền tảng Solaris 8 thay vì tuân theo điều khoản cụ thể này. Nhưng tôi nhận thấy rằng phiên bản gcc mới nhất kết thúc hỗ trợ Solaris 8 và tôi đoán đây là bước đầu tiên đi đúng hướng.

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