Будет ли стандарт C ++ 20 включать стандарт C18 - PullRequest
1 голос
/ 05 марта 2020

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

Ответы [ 3 ]

3 голосов
/ 05 марта 2020

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)

2 голосов
/ 05 марта 2020

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

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

0 голосов
/ 05 марта 2020

Я полагаю, что причина вашего вопроса в том, что когда вы используете extern "C" в 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;
...