代码改变世界

(转)C++的extern "C"

2013-07-28 10:40  虫虫与贝贝  阅读(249)  评论(0)    收藏  举报

使用原则: 当在C++中引用C的函数或变量,在包含C头文件的时候应该使用extern "C"。

ps: C的函数或变量指的是通过gcc编译的c文件。

1.1 utils.h

#ifndef __utils_h__
#define __utils_h__
int add(int,int);

#endif

1.2 utils.c

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

1.3 main.cpp

#include<iostream>
#ifdef __cplusplus
extern"C"{
#endif
  #include"utils.h"
#ifdef __cplusplus
}
#endif
int main(int argc,char* argv[]){
std::cout <<"Hello World!!\n";int x =20;int y =40; std::cout << x <<" + "<< y <<" = "<< add(x, y)<<"\n";return0;}
# 标准的编译方式
$ gcc -c -Iinclude src/utils.c          # 通过gcc编译c文件
$ g++ -Iinclude utils.o src/main.cpp    # 通过g++编译c++文件# 非标准的编译方式
$ g++ -c -Iinclude src/utils.c          # 使用g++编译c文件,会对函数名进行编码
$ g++ -Iinclude utils.o src/main.cpp    # g++编译main.cpp时,由于包含extern "C"会编译# 不通过,如果想通过g++来编译c文件,extern "C"# 应该不添加

由于.c文件不支持extern "C",所以第二种用法就是使用.cpp编写c函数或变量

2.1 utils1.h

#ifndef __utils1_h__
#define __utils1_h__

int add1(int,int);

#endif

2.2 utils1.cpp

#ifdef __cplusplus
extern"C"{
#endif
  
#include"utils1.h"
#ifdef __cplusplus
}
#endif

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

2.3 main1.cpp

#include<iostream>
#ifdef __cplusplus
extern"C"{
#endif
  
#include"utils1.h"
#ifdef __cplusplus
}
#endif
int main(int argc,char* argv[]){
std::cout <<"Hello World!!\n";int x =20;int y =40; std::cout << x <<" + "<< y <<" = "<< add1(x, y)<<"\n";
  return0;
}
$ g++ -Iinclude src/utils1.cpp src/main1.cpp # 在.cpp中编写c函数或变量时包含头文件时# 应该使用extern "C",然后统一使用g++# 进行编译
转自:http://blog.linguofeng.com/archive/2013/04/01/cpp-extern-c.html