目录
概念一览
- extern “C” 用来在cpp程序中实现对c程序函数的调用;
- C语言和C++语言在编译结束之后生成的函数名是不同的:C++规则下生成的函数名与参数的数量和类型有关?造成的结果就是,cpp程序调用c中的函数时,找不到函数,即:函数名不匹配;
- 在cpp中,利用extern “C”,告诉编辑器,该函数的编译采用C语言的规则,则生成的函数名与C程序中实现的函数函数名相同,故可以实现调用;
- 下例中,由于__cplusplus 这个宏是C++中特有的,加载 C++文件的时候会提前定义这个宏,因此我们进行判断:有这个宏就是 C++在调用,没有的话就是 C在调用;
代码部分↓
// cpp中调用c.h------------------------------------------------------
#pragma once
#ifndef __SUM_H
#define __SUM_H
#ifdef __cplusplus
extern "C" { // 该行代码在C++调用时,生效
#endif
int sum_of_c(int a, int b); // 函数声明
#ifdef __cplusplus
} // 该括号在C++调用时,生效
#endif
#endif
// cpp中调用c.c-------------------------------------------------------
#include "cpp中调用c.h"
#include <stdio.h>
// 函数实现,采用C语言的形式
int sum_of_c(int a, int b) {
return a + b;
}
// cpp中调用c.cpp-----------------------------------------------------
#include <iostream>
#include "cpp中调用c.h"
using namespace std;
extern "C" int sum_of_c(int a,int b); // C语言规则进行编译
int main() {
int result;
result = sum_of_c(5,7);
cout << "因为c和cpp对同一个带参函数编译后的函数名不同 \n因此函数实现放在.c文件中的话,.cpp文件执行时链接不到该函数"<<endl;
cout << "但结果告诉我们:cpp文件按照c的方式执行了,因此函数名和.c中的函数实现对应上了,找到了 \n5 + 7求和的结果是:" << result << endl;
return 0;
}
运行结果如下↓