Существует два довольно разных варианта использования extern "C"
. Один из них - определить функцию в C ++, которую вы должны вызывать из C. Т.е. вы пишете код на C ++, но он должен взаимодействовать с кодом C. В этом случае вы определяете функцию как extern "C"
:
extern "C" {
int c_callable_func1() {}
int c_callable_func2() {}
}
Когда вы делаете это, интерфейс этих функций должен следовать в значительной степени тем же правилам, что и в C (например, вы не можете перегружать функции или использовать значения по умолчанию для любых параметров).
Другая (значительно более распространенная) ситуация состоит в том, что у вас есть код, написанный на C, который вы хотите вызывать из C ++. В этом случае функции определения остаются такими же, как и раньше, но функции должны быть объявлены / прототипированы как extern "C"
. В типичном случае вы хотите использовать один заголовок, который может быть #include
d в файле C или C ++, поэтому структура выглядит примерно так:
// myheader.h
#ifndef MY_HEADER_H_INCLUDED_
#define MY_HEADER_H_INCLUDED_
#ifdef __cplusplus
extern "C" {
#endif
int func1(void);
void func2(int);
#ifdef __cplusplus
}
#endif
#endif
Итак, компилятор C ++ увидит объявления функций (и typedef
s и т. Д.), Окруженные блоком extern "C"
, в то время как компилятор C увидит прототипы, не окруженные чем-то, что он не распознает.
В первом случае (функции C ++, вызываемые из C), вы обычно будете структурировать заголовок примерно таким же образом, так что вы также можете вызывать эти функции из C ++, если это необходимо (но в интерфейсе вы по-прежнему теряете все дополнительные функции). C ++, как перегрузка функций).