Chinaunix首页 | 论坛 | 博客
  • 博客访问: 398949
  • 博文数量: 75
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 645
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-03 18:24
文章分类

全部博文(75)

文章存档

2019年(1)

2018年(20)

2017年(14)

2016年(10)

2015年(30)

分类: 嵌入式

2015-09-18 22:41:23

  在看代码的时候,我们会时不时就会看到这样的代码

点击(此处)折叠或打开

  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif

  4. //代码

  5. #ifdef __cplusplus
  6. }
  7. #endif
这样的代码有什么用处呢?可能对于一些初学者来说,都不知道这用来做什么的。下面就来讲讲这个的用处。


 extern “c”的作用就是为了在c++代码中能够调用之前编译过的c代码。不知道这样说准不准确,这是我现在对extern “c”的理解。

下面通过一个例子让我们来理解extern “c”的用法。
首先创建一个extern_c.c文件,一个extern_c.h文件,一个main.cpp文件

这里的是main.cpp文件中调用了extern_c.c文件中的函数。也是c++函数调用了c函数。

main.cpp里面的内容

点击(此处)折叠或打开

  1. #include <iostream>
  2. #include "extern_c.h"

  3. using namespace std;

  4. int main(void)
  5. {
  6.     int a;
  7.     a = add(4,5);

  8.     cout <<a<<endl;
  9. }

extern_c.h里面的内容是

点击(此处)折叠或打开

  1. #ifndef _EXTERN_C_H
  2. #define _EXTERN_C_H
  3. #if 0
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7. #endif

  8. int add(int x,int y);

  9. #if 0
  10. #ifdef __cplusplus
  11. }
  12. #endif
  13. #endif

  14. #endif

extern_c.c里面的内容是

点击(此处)折叠或打开

  1. #include "extern_c.h"

  2. int add(int x,int y)
  3. {
  4.     return (x+y);
  5. }

extern_c.c用gcc编译器编译,main.cpp用g++编译器编译,编译结果如下:

编译会报错, undefined reference to `add(int, int)',找不到add(int, int)。


但是如果把extern_c.h改成

点击(此处)折叠或打开

  1. #ifndef _EXTERN_C_H
  2. #define _EXTERN_C_H
  3. #if 1
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7. #endif

  8. int add(int x,int y);

  9. #if 1
  10. #ifdef __cplusplus
  11. }
  12. #endif
  13. #endif

  14. #endif

再次编译运行:


这次就能成功编译运行,也许很多人都不知道怎么回事,怎么就加了个extern “c” {}就可以运行了。

     为了更好的说明这个现象。下面把把它们编译成目标文件,看下目标文件都有哪些符号?
    在没有用extern “c”的情况下


gcc编译出来的int add(int x,int y);的符号是add,g++编译出来的int add(int x,int y);是_Z3addii。

在用了extern “c”的情况下

g++编译出来的int add(int x,int y);add

原因一目了然。

不爽---------------------------------------------------------------------------


阅读(1271) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~