Краткий ответ на вопрос
Как я могу заставить C ++ 0x и __STRICT_ANSI__ ладить?
должно быть: используйте -std=gnu++0x
вместо -std=c++0x
. Это должно не определять __STRICT_ANSI__
[1] , так что, вероятно, в вас есть что-то еще Makefile
или среда сборки, которая все еще заставляет это быть определено [2] .
Обходной (менее предпочтительный) обходной путь, как указывали другие, состоял бы в том, чтобы удалить его с помощью переключателя командной строки -U__STRICT_ANSI__
.
Обратите внимание, что для указания того, для какого стандарта C написан ваш код, -std=gnu++*
будет типичным переключателем, а не -std=c++*
, если вы хотите расширения GNU (в gcc
расширения GNU). включены по умолчанию, но будут отключены, если вы укажете -std=c++*
).
Еще одна заметка; для C это похоже:
$ touch empty.c
$ gcc -std=c99 -E -dM empty.c | grep '\(__STRICT\|__STDC_V\)'
#define __STRICT_ANSI__ 1
#define __STDC_VERSION__ 199901L
$ gcc -std=gnu99 -E -dM empty.c | grep '\(__STRICT\|__STDC_V\)'
#define __STDC_VERSION__ 199901L
Вы получите языковую поддержку для желаемой версии C, с или без __STRICT_ANSI__
(возможно, есть и другие различия).
[1]:
С https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html:
__ STRICT_ANSI __
GCC определяет этот макрос тогда и только тогда, когда при вызове GCC был указан ключ -ansi или -std, указывающий строгое соответствие какой-либо версии ISO C или ISO C ++ . Он определен как «1». Этот макрос существует главным образом для того, чтобы указать заголовочным файлам GNU libc ограничить их определения минимальным набором, найденным в стандарте C. 1989 г.
То, что это так, можно легко подтвердить (запустить на gcc
4.8.2):
$ touch empty.cpp
$ gcc -std=c++0x -E -dM empty.cpp | grep '__STRICT'
#define __STRICT_ANSI__ 1
$ gcc -std=gnu++0x -E -dM empty.cpp | grep '__STRICT'
$ # (no match)
[2]: Возможно, добавлен переключатель -ansi
? Это даст __STRICT_ANSI__
, даже если указать -std=gnu++*
, как указано в документации (см. Цитату выше), и может быть легко проверено:
$ gcc -std=gnu++0x -E -dM -ansi empty.cpp | grep '__STRICT'
#define __STRICT_ANSI__ 1