C++20标准会包含C18标准吗
Will C++20 standard include C18 standard
我尝试 google 并在 openstd 组织上快速搜索 "C lang" 和 "C18" 的最新草稿。
C++标准会支持最新的C标准吗?
C++ is a general purpose programming language based on the C programming language as described in ISO/IEC 9899:2018 Programming languages — C (hereinafter referred to as the C standard).
C++ provides many facilities beyond those provided by C, including additional data types, classes, templates, exceptions, namespaces, operator overloading, function name overloading, references, free store management operators, and additional library facilities.
http://eel.is/c++draft/intro.scope
C18 (previously known as C17) is the informal name for ISO/IEC 9899:2018, the most recent standard for the C programming language, published in June 2018. It replaced C11 (standard ISO/IEC 9899:2011).
我相信你的问题背后的原因是,当你在 C++ 中使用 extern "C"
时,它会以某种方式调用特定版本的单独 C 编译器。
没有。 extern "C"
所做的是告诉 C++ 编译器对这些函数使用 C linkage,以便其他使用 C linkage 的代码可以正确地 link 这些函数。它不会影响源代码的编译方式,除了如果您尝试在 extern
块内重载非成员函数会抛出编译器错误。
如果你写一些东西,C++ 编译器不会抱怨一点 like this:
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;
C++(任何版本)不批发C(任何版本)。它只是根据需要引用 C 规范的部分内容。例如,C++ 包含(大部分)C 标准库,它通过引用 C 标准的适当部分而不是从中复制来实现。
当 C++20 引用 C 规范的一个版本时,它引用 C18。
我尝试 google 并在 openstd 组织上快速搜索 "C lang" 和 "C18" 的最新草稿。 C++标准会支持最新的C标准吗?
C++ is a general purpose programming language based on the C programming language as described in ISO/IEC 9899:2018 Programming languages — C (hereinafter referred to as the C standard).
C++ provides many facilities beyond those provided by C, including additional data types, classes, templates, exceptions, namespaces, operator overloading, function name overloading, references, free store management operators, and additional library facilities.
http://eel.is/c++draft/intro.scope
C18 (previously known as C17) is the informal name for ISO/IEC 9899:2018, the most recent standard for the C programming language, published in June 2018. It replaced C11 (standard ISO/IEC 9899:2011).
我相信你的问题背后的原因是,当你在 C++ 中使用 extern "C"
时,它会以某种方式调用特定版本的单独 C 编译器。
没有。 extern "C"
所做的是告诉 C++ 编译器对这些函数使用 C linkage,以便其他使用 C linkage 的代码可以正确地 link 这些函数。它不会影响源代码的编译方式,除了如果您尝试在 extern
块内重载非成员函数会抛出编译器错误。
如果你写一些东西,C++ 编译器不会抱怨一点 like this:
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;
C++(任何版本)不批发C(任何版本)。它只是根据需要引用 C 规范的部分内容。例如,C++ 包含(大部分)C 标准库,它通过引用 C 标准的适当部分而不是从中复制来实现。
当 C++20 引用 C 规范的一个版本时,它引用 C18。