-
Notifications
You must be signed in to change notification settings - Fork 77
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
LLVM/Clang
C/C++
- Get lower 32 bits from uint64
- How to unpack a std::tuple to a function with multiple arguments?
- {}-list Initialization
- Empty macro arguments
- 为什么能在函数中以by value方式返回unique_ptr?
- c++unsigned类型提升
- extern "C"
Linux
- ubuntu获取源码方法
- gcc/g++常用命令
- 浏览器导入安全证书
- ubuntu下宏包latex安装
- Bash Shell常用快捷键
- ubuntu把/tmp目录挂载到内存
- tar命令
- voyager12.04 apt-get install无法安装解决方法
- terminal shows git branch
- 编译GTK API源程序(附带pkg-config用法)
- ldconfig检查库是否存在
- Googletest Setup&Install
- Centos设置service开机自动启动
- CentOS create admin user
- 设置时区
- MySQL修改root密码
- MySQL常用命令
- Screen使用
- 环境变量
- Unity桌面环境的desktop文件
- zip和gzip文件区别
- Linux安全设置
Vim
- vim列编辑
- vim编辑二进制文件
- vim quickfix窗口
- Vim 批量操作
- Vim对多行重复操作
- mac下vim编译安装
- mac下vim taglist无效解决方法
- Vim 配置vim-airline
Tools
- gdb cgdb命令
- Source Insight添加.cc文件
- Source Insight快捷键
- GPT分区转MBR分区
- IRC工具Pidgin使用
- iTerm2 shortcuts
- MacOS shortcuts
- Compile/Run JUnitTest in Command Line
- Install Python2.7 on CentOS 6.4
- Install vmware tool on ubuntu server 12.04
- node-gyp Usage
- zsh中文乱码解决方法
- tmux快捷键
- 使用aria2突破百度云盘限速
- 配置 scheme编写环境
- How to list all available targets in ninja
Others
- CRLF换行符
- Git autocrlf设置
- Git reflog数据恢复命令
- how to migrate from SVN repo to Git repo
- Git submodule使用
- Git Pull强制更新
Chromium-Dev tips