extern “C“

1.C++与C编译区别

        在C++中常在头文件见到extern "C"修饰函数,那有什么作用呢? 是用于C++链接在C语言模块中定义的函数。

        C++虽然兼容C,但C++文件中函数编译后生成的符号与C语言生成的不同。因为C++支持函数重载,C++函数编译后生成的符号带有函数参数类型的信息,而C则没有。

        例如`int add(int a, int b)`函数经过C++编译器生成.o文件后,`add`会变成形如`add_int_int`之类的, 而C的话则会是形如`_add`, 就是说:相同的函数,在C和C++中,编译后生成的符号不同。

        这就导致一个问题:如果C++中使用C语言实现的函数,在编译链接的时候,会出错,提示找不到对应的符号。此时`extern "C"`就起作用了:告诉链接器去寻找`_add`这类的C语言符号,而不是经过C++修饰的符号。

2.C++调用C函数

        C++调用C函数的例子: 引用C的头文件时,需要加`extern "C"`

add.h

#ifndef ADD_H
#define ADD_H
int add(int x,int y);
#endif

add.c

#include "add.h"

int add(int x,int y) {
    return x+y;
}

add.cpp

#include <iostream>
using namespace std;
#include "add.h"

/*
extern "C" {
    #include "add.h"
}
*/

int main() {
    cout<<add(20,30)<<endl;
	
    return 0;
}

编译:

//Generate add.o file
gcc -c add.c

链接:

g++ add.cpp add.o -o main

没有添加extern "C" 报错:

 添加extern "C"后:

#include <iostream>
using namespace std;
//#include "add.h"

extern "C" {
    #include "add.h"
}

int main() {
    cout<<add(20,30)<<endl;
	
    return 0;
}

        编译的时候一定要注意,先通过gcc生成中间文件add.o。

        而通常为了C代码能够通用,即既能被C调用,又能被C++调用,头文件通常会有如下写法:

#pragma once

#ifdef __cplusplus
extern "C"{
#endif

#include<stdio.h>
void show();

#ifdef __cplusplus
}
#endif

        即在C++调用该接口时,会以C接口的方式调用。这种方式使得C++者不需要额外的extern C,而标准库头文件通常也是类似的做法,否则你为何不需要extern C就可以直接使用stdio.h中的C函数呢?

 2.C中调用C++函数

`extern "C"`在C中是语法错误,需要放在C++头文件中。

add.h

#ifndef ADD_H
#define ADD_H
extern "C" {
    int add(int x,int y);
}
#endif

add.cpp

#include "add.h"

int add(int x,int y) {
    return x+y;
}

add.c

#include <stdio.h> 

extern int add(int x,int y);

int main() {
    printf("%d",add(12,13));
    return 0;
}

编译:

g++ -c add.cpp

链接:

gcc add.c add.o -o main

         综上,总结出使用方法,在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误。所以使用extern "C"全部都放在于cpp程序相关文件或其头文件中。

总结出如下形式:

(1)C++调用C函数:                                (2)C调用C++函数

                                 

 

        不过与C++调用C接口不同,C++确实是能够调用编译好的C函数,而这里C调用C++,不过是把C++代码当成C代码编译后调用而已。也就是说,C并不能直接调用C++库函数。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值