02月25, 2018

C与C++中函数的互相调用

考虑两种情况:一是在C++中调用C的函数,二是在C中调用C++的函数。

首先要确定一个问题,在这里我们的C文件使用gcc编译,CPP文件使用g++编译。假设如果我们都采用g++编译的话,这意味着所有函数调用格式都是CPP的,也就不存在C和CPP的区别了。

对于这种调用问题,我们知道一般是使用extern关键字来解决,下面就来讲解它的具体用法。首先要说明一下是,extern关键字是用来声明而不是定义的,因此在一个文件中使用它声明一个变量或函数,那么这个文件就可以使用这个变量或函数了,而定义可以在别的文件中。

我们考虑有这样两个文件:test.ctestcpp.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");
}

本文链接:https://debug.fanzheng.org/post/function-call-of-C-and-CPP.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。