GNU C++ biên dịch dường như để xác định __cplusplus
là 1
Gnu 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?
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
Làm thế nào về '#ifndef nullptr'' #define nullptr NULL' '# endif' hoặc' #ifdef nulldr' '#define MYNULL nullptr'' # else' '#define MYNULL NULL'' # endif' –