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