С++-код и макросы версии C
Ожидается, что это будет слишком конкретный вопрос. Это, вероятно, потому, что мне не хватает базовых знаний, которые я не могу найти по поиску. Не стесняйтесь отвечать на более общую версию вопроса, если это имеет смысл.
Учитывая некоторый код на С++, я хотел бы узнать, соответствует ли (и затем как) его версия стандартных стандартов, а его версия стандартов C (если есть) коррелирует.
Я подтвердил, что этот тестовый код
#include <cstdio>
int main(void)
{
printf("%ld\n", _POSIX_C_SOURCE);
return 0;
}
печатает "200809" при компиляции с любым из "g++ -std = С++ 98", "g++ -std = С++ 11", "clang++ -std = С++ 98", "clang++ -std = С++ 11".
(Когда я компилирую C с любой версией явных стандартов, макрос _POSIX_C_SOURCE вообще не определен).
Почему? Что совсем не имеет смысла, так это то, что компиляция С++ 98-эффектов в _POSIX_C_SOURCE составляет 200809 (то есть через 10 лет).
Ответы
Ответ 1
Есть две вещи, которые вы можете искать:
- Если вы хотите обнаружить С++ 98: Макрос
__cplusplus
определяется как 199711L
.
- Если вы хотите обнаружить С++ 11: Макрос
__cplusplus
определяется как 201103L
.
Если вы хотите определить версии компилятора, этот сайт содержит массу информации о различных макросах, которые применяются: http://sourceforge.net/p/predef/wiki/Compilers/
Что касается _POSIX_C_SOURCE
, это атрибут функций, доступных в стандартной стандартной библиотеке. Поэтому, поскольку вы используете новый glibc (atleast 2.10), вы можете поддерживать эти функции.
Что касается компилятора C, который не сообщает эти значения, вам может потребоваться явно указать <features.h>
для доступа к ним.
Ответ 2
Ну, я думаю, потому что _POSIX_C_SOURCE не относится ни к одной стандартной спецификации С++, а к спецификациям POSIX:
_POSIX_C_SOURCE
Defining this macro causes header files to expose definitions
as follows:
· The value 1 exposes definitions conforming to POSIX.1-1990
and ISO C (1990).
· The value 2 or greater additionally exposes definitions for
POSIX.2-1992.
· The value 199309L or greater additionally exposes
definitions for POSIX.1b (real-time extensions).
· The value 199506L or greater additionally exposes
definitions for POSIX.1c (threads).
· (Since glibc 2.3.3) The value 200112L or greater exposes
definitions corresponding to the POSIX.1-2001 base
specification (excluding the XSI extension).
· (Since glibc 2.10) The value 200809L or greater exposes
definitions corresponding to the POSIX.1-2008 base
specification (excluding the XSI extension).
Значение, которое вы получаете, является значением по умолчанию, поддерживаемым используемым вами компилятором/библиотеками.
Ответ 3
_POSIX_C_SOURCE может быть расширением компилятора.
Это спецификация POSIX, а не спецификация С++.
поэтому какой-то компилятор не поддерживает его.