考虑两种情况:一是在C++中调用C的函数,二是在C中调用C++的函数。
首先要确定一个问题,在这里我们的C文件使用gcc编译,CPP文件使用g++编译。假设如果我们都采用g++编译的话,这意味着所有函数调用格式都是CPP的,也就不存在C和CPP的区别了。
对于这种调用问题,我们知道一般是使用extern
关键字来解决,下面就来讲解它的具体用法。首先要说明一下是,extern
关键字是用来声明而不是定义的,因此在一个文件中使用它声明一个变量或函数,那么这个文件就可以使用这个变量或函数了,而定义可以在别的文件中。
我们考虑有这样两个文件:test.c
和testcpp.cpp
,我们使用如下命令进行编译和运行:gcc -c test.c && g++ -c testcpp.cpp && gcc -o test test.o testcpp.o && ./test
我们先考虑第一种情况,即在C++中调用C的函数。
我们只需在C++中使用extern
关键字声明一下要调用的函数即可,但要用"C"
来修饰一下,表示声明的这个函数是C格式的。
test.c
:
#include<stdio.h>
void hello()
{
printf("test\n");
}
testcpp.cpp
:
extern "C"
{
void hello();
}
int main()
{
hello();
return 0;
}
如果只有一个函数的话,也可以直接extern "C" void hello();
。
对于第二种情况,即在C中调用C++的函数,稍微有点变化,但也不是很麻烦。
我们采取的方案是,在C++中将函数声明为C格式的,也就是在编译时将它编译成C格式的,而在C中直接按照C原本的格式调用即可,因为此时函数已经是C可以直接调用的格式了。
test.c
:
void hello();
int main()
{
hello();
return 0;
}
testcpp.cpp
:
#include<cstdio>
extern "C"
{
void hello();
}
void hello()
{
printf("test\n");
}
对于testcpp.cpp
也可以这样把声明和定义写在一起:
#include<cstdio>
extern "C" void hello()
{
printf("test\n");
}
Comments
注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。