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