Будет ли стандарт C++20 включать стандарт C18

Я попытался погуглить и быстро найти последний черновик для "C lang" и "C18" на openstd org. Будет ли стандарт C++ поддерживать новейшие стандарты C?

3 ответа

Решение

C++ (любой версии) не включает C (любой версии) оптом. Он просто ссылается на части спецификации C по мере необходимости. Например, C++ включает (большую часть) стандартной библиотеки C, и делает это путем ссылки на соответствующие части стандарта C вместо копирования из него.

Когда C++20 ссылается на версию спецификации C, он ссылается на C18.

C++ - это язык программирования общего назначения, основанный на языке программирования C, как описано в ISO/IEC 9899:2018 Языки программирования - C (в дальнейшем именуемый стандартом C).

C++ предоставляет множество возможностей помимо тех, которые предоставляет C, включая дополнительные типы данных, классы, шаблоны, исключения, пространства имен, перегрузку операторов, перегрузку имен функций, ссылки, бесплатные операторы управления хранилищем и дополнительные возможности библиотеки.

http://eel.is/c++draft/intro.scope

C18 (ранее известный как C17) - неофициальное название ISO/IEC 9899:2018, последнего стандарта для языка программирования C, опубликованного в июне 2018 года. Он заменил C11 (стандарт ISO / IEC 9899:2011).

https://en.m.wikipedia.org/wiki/C18_(C_standard_revision)

Я считаю, что причина вашего вопроса в том, что когда вы используете extern "C" в C++ он каким-то образом вызывает отдельный компилятор C определенной версии.

Это не так. какойextern "C"указывает компилятору C++ использовать связь C для функций, чтобы другой код, использующий связь C, мог правильно связываться с этими функциями. Это не влияет на то, как компилируется исходный код, за исключением того, что выдает ошибки компилятора, если вы пытаетесь перегрузить функции, не являющиеся членами, внутриextern блок.

Компилятор C++ ни капли не пожалуется, если вы напишете что-то вроде этого:

extern "C" {

    // this is still a C++ compiler, works as usual
    class CPP
    {
        public:

            // these are inside a class and can be overloaded,
            // and they will be mangled as usual
            static int foo(int i) { return i; };
            static int foo(int i, int j) { return i + j; }
    };

    // these will not be mangled due to 'extern "C"'        
    int foo(int i) { return CPP::foo(i); }
    int bar(int i, int j) { return CPP::foo(i, j); }
}

В то же время этот простой код на C не даст сбоя в любом компиляторе C++:

int * x = malloc(1);

Как и этот код из C11, поскольку _Atomic не является допустимым квалификатором в стандарте C++:

#include <stdatomic.h>    
_Atomic int x;
Другие вопросы по тегам