Компилятор Gnu C ++, кажется, определяет __ cplusplus
как 1
#include
int main() {
std::cout << __cplusplus << std::endl;
}
Это печатает 1
с помощью gcc в в стандартном режиме C ++, а также в режиме C ++ 0x с gcc 4.3.4 и gcc 4.7.0.
C ++ 11 FDIS говорит в «16.8 Предопределенные имена макросов [cpp.predefined]» , что
Имя
__ cplusplus
определяется значением 201103L при компиляции единицы трансляции C ++. (Сноска: предполагается, что в будущих версиях этого стандарта значение этого макроса будет заменено на большее значение. Несоответствующие составители com - должны использовать значение, содержащее не более пяти десятичных цифр.)
В старом стандартном C ++ 03 было аналогичное правило.
GCC намеренно устанавливает это значение на 1
, потому что это «несоответствие» ?
Прочитав этот список, я подумал, что могу использовать __ cplusplus
, чтобы проверить переносимым способом, есть ли у меня компилятор с поддержкой C ++ 11. Но с g ++ это не работает. Я знаю о макросе ... EXPERIMENTAL ...
, но мне стало любопытно, почему g ++ определяет __ cplusplus
таким образом.
Моя первоначальная проблема заключалась в переключении между различными вариантами нулевого указателя. Примерно так:
#if __cplusplus > 201100L
# define MYNULL nullptr
#else
# define MYNULL NULL
#endif
Есть ли простой и достаточно переносимый способ реализовать такой переключатель?