зачем использоватьextern "C"
При разработке C++ правила компиляции C и C++ различаются. Метод функции компиляции С++Техника с использованием MaNgle..
void func(int age) {
}
void func(int age, int height) {
}
/*如果有这两个函数要被调用,在C语言中函数重载是不允许的,那么在C++中为什么可以呢。
C++中就是使用了mangle技术,对函数重载的函数名加上编译器中自定义规则的表示符,编译之后的函数名就会不一样。
例如 func(int age) -> func_int(int age)
func(int age, int height) -> func_int_int(int age, int height)
*/
В языке C такой технологии нет, поэтому, если мы хотим вызывать некоторые API, разработанные на языке C, нам нужно использоватьextern "C"
Изменяет объявления функций на языке C.
extern "C"
Применение
- непосредственно перед функцией
extern "C"
ключевые слова
extern "C" void fun() {
printf("test");
}
- Если есть объявление функции и реализация функции, пусть функция объявляет
extern "C"
Модификация, реализация функции может быть без изменений
extern "C" void func();
void func() {
cout << "func()" << endl;
}
- Если необходимо несколько функций
extern "C"
Изменено, вы можете обернуть его напрямую {}
extern "C" {
void func();
void func1();
}
void func() {
cout << "func()" << endl;
}
void func1() {
cout << "func1()" << endl;
}
Пользовательская библиотека функций языка C
Но мы используем это каждый раз, когда используем API языка C.extern "C"
Слишком сложно модифицировать, тогда мы научились его использоватьextern "C"
, мы можем напрямую использовать это для декорирования при написании библиотеки API языка C, тогда C++ не должен быть таким хлопотным при повторном вызове, просто используйте эту функцию напрямую.
//在sum.h文件中定义sum函数
extern "C" {
int sum(int a, int b);
}
int sum(int a, int b) {
return a + b;
}
//在main.cpp文件中包含这个库文件之后就可以直接使用了
int main()
{
cout << sum(1, 2) << endl;
getchar();
}
Но если он определен так, то возникнет другая проблема, то есть библиотека не может быть вызвана в файле языка C
Потому что в языке C нетextern "C"
это ключевое слово. Вызов этой библиотеки заключается в прямом копировании кода файла этой библиотеки. Например:
#include <stdio.h>
#include "sum.h"
extern "C" {
int sum(int a, int b);
}
int sum(int a, int b) {
return a + b;
}
void main() {
printf("%d", sum(3, 4));
}
Затем нам нужно определить эту библиотеку сумм, когдадобавить некоторые ограничения, пусть добавит при вызове C++extern "C"
ключевое слово, которое удаляется, когда оно вызывается языком C.
//sum.h文件声明
#ifndef __SUM_H
#define __SUM_H
#ifdef __cplusplus
extern "C" {
#endif
int sum(int a, int b);
#ifdef __cplusplus
}
#endif
#endif
//sum.c文件实现
#include "sum.h"
int sum(int a, int b) {
return a + b;
}
__cplusplus
Этот макрос написан на C++.Уникальный. Когда он загружает файл C++Этот макрос будет определен заранее, поэтому мы простоПроверьте, есть ли этот макрос в файле, если есть, то вызывает C++, если нет, то это язык C, который может очень хорошо решить проблему этого смешанного вызова.