加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

extern "C"

发布时间:2020-12-16 09:18:13 所属栏目:百科 来源:网络整理
导读:extern "C" ? LuChenQun edited this page?Mar 30,2019?·? 3 revisions 在C++中常在头文件见到extern "C"修饰函数,那有什么作用呢? 是用于C++链接在C语言模块中定义的函数。 C++虽然兼容C,但C++文件中函数编译后生成的符号与C语言生成的不同。因为C++支

extern "C"

?
LuChenQun edited this page?Mar 30,2019?·? 3 revisions

在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++修饰的符号。

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

//cExample.h
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
int add(int x,int y);
#endif

//cExample.c
#include "cExample.h"
int add( int x,int y ) {
  return x + y;
}

//cppExample.cpp
extern "C" {
  #include "cExample.h"
}

int main(int argc,char* argv[]) {
  add(2,3); 
  return 0;
}
//Generate cExample.o file
gcc -c cExample.c
g++ -c cppExample.cpp
g++ cppExample.cpp cExample.o -o main

注意,如果cppExample.cpp中没有extern "c"的话,会在最后一步链接的时候出错。

C中调用C++函数:extern "C"在C中是语法错误,需要放在C++头文件中。

// cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" { int add( int x,int y ); }
#endif

// cppExample.cpp
#include "cppExample.h"
int add( int x,int y ) {
  return x + y;
}

// cExample.c
extern int add( int x,int y );
int main() {
  add( 2,3 ); 
  return 0;
}

Reference:?http://www.cppblog.com/macaulish/archive/2008/06/17/53689.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读