用用extern"C" 实现跨语言加法时,输出的结果为不确定值,
首先用c写了一个加法函数,放在.c文件中
int sum(int a, int b)
{
return a + b;
}
.cpp文件:
#include<iostream>
#include<string>
using namespace std;
extern"C"
{
int sum(int a, int b);
}
int main() {
int ret = sum(10, 10);
cout << "sum="<<sum << endl;
return 0;
}
结果:
sum=00F01311
extern"C" 需要修饰声明,也需要修饰实现。
文件扩展名是c,生成的obj文件中sum函数不一定满足C调用约定
function.c
int add(int a ,int b)
{
return a+b;
}
编译该文件:
gcc -c function.c
这样就会在目录下生成一个function.o文件
接着将其打包成静态库文件
ar -r libfunc.a *.o
到此为止,就编写了一个c语言的静态链接库。
为了这个库可以被c或者c++进行调用,需要使用extern “C”去编写一个头文件。头文件如下所示:
function.h
#ifdef __cplusplus
extern "C" {
#endif
extern int add(int a ,int b);
#ifdef __cplusplus
}; /* end of extern "C" */
#endif
#ifndef __cplusplus
extern int add(int a ,int b);
#endif
首先是第一部分:
#ifdef __cplusplus
extern "C" {
#endif
extern int add(int a ,int b);
#ifdef __cplusplus
}; /* end of extern "C" */
#endif
这段的意思是如果是C++语言引入了这个头文件,那么就使用extern "C"去声明该函数。
接着是第二部分:
#ifndef __cplusplus
extern int add(int a ,int b);
#endif
这段的意思是如果是c语言引入了这个头文件,就直接使用extern进行声明。
接下来在c语言中调用这个库中的函数。
main.c
#include "stdio.h"
#include "function.h"
int main()
{
int i = add(2,3);
printf("2+3=%d\n",i);
return 0;
}
接下来在c++程序中调用这个库中的函数。
main.cpp
#include <iostream>
using namespace std;
#include "function.h"
int main()
{
int i = add(2,3);
cout<<"2+3="<<i<<endl;
return 0;
}
int main() {
int ret = sum(10, 10);
cout << "sum="<<ret<< endl;//这里注意
return 0;
}