C++20标准是否包括C18标准



我试着在openstd.org上搜索"C lang"one_answers"C18"的最新草案。C++标准会支持C的最新标准吗?

C++是一种通用编程语言,基于ISO/IEC 9899:2018编程语言-C(以下简称C标准(中描述的C编程语言。

C++提供了许多C提供的功能之外的功能,包括额外的数据类型、类、模板、异常、命名空间、运算符重载、函数名重载、引用、免费存储管理运算符和额外的库功能。

http://eel.is/c++草稿/简介范围

C18(以前称为C17(是ISO/IEC 9899:2018的非正式名称,该标准是C编程语言的最新标准,于2018年6月发布。它取代了C11(标准ISO/IEC 9899:2011(。

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

C++(任何版本(不包括C(任何版本的(批发。它只是根据需要引用C规范的部分内容。例如,C++包含(大部分(C标准库,它通过引用C标准的适当部分而不是从中复制来实现

当C++20引用C规范的一个版本时,它引用的是C18。

我相信您的问题背后的原因是,当您在C++中使用extern "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;

最新更新