Как вызвать код C в C++

C++

зачем использовать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, который может очень хорошо решить проблему этого смешанного вызова.