С++-код и макросы версии 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, а не спецификация С++.

поэтому какой-то компилятор не поддерживает его.