Chinaunix首页 | 论坛 | 博客
  • 博客访问: 544689
  • 博文数量: 104
  • 博客积分: 2089
  • 博客等级: 大尉
  • 技术积分: 1691
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-29 08:48
文章分类

全部博文(104)

文章存档

2015年(1)

2013年(13)

2012年(31)

2011年(59)

分类: C/C++

2011-12-16 16:43:58

常见的样式
extern “C”{ ... }
extern "C" return-type func-name(type , type ){}
extern "C" return-type func-name(type , type );

含义:在C++中,以C语言的方式编译源文件。
例子
//t_extern_yes.cpp
  1. extern "C"
  2. {
  3.         int f(void)
  4.         {
  5.                 return 0;
  6.         }
  7. }
//t_extern_non.cpp
  1. int f(void)
  2. {
  3.         return 0;
  4. }
汇编
  1. gcc t_extern_non.cpp t_extern_yes.cpp
  2. 或者
  3. gcc t_extern_non.cpp t_extern_yes.cpp
 得到
  1. .file "t_extern_non.cpp"
  2. .text
  3. .align 2
  4. .globl _Z1fv
  5. .type _Z1fv, @function
  6. _Z1fv:
  7. .LFB2:
  8. pushl %ebp
  9. .LCFI0:
  10. movl %esp, %ebp
  11. .LCFI1:
  12. movl $0, %eax
  13. popl %ebp
  14. ret
  15. .LFE2:
  16. .size _Z1fv, .-_Z1fv
  17. .globl __gxx_personality_v0
  18. .ident "GCC: (GNU) 4.2.1 (SUSE Linux)"
  19. .section .note.GNU-stack,"",@progbits
  1. .file "t_extern_yes.cpp"
  2. .text
  3. .align 2
  4. .globl f
  5. .type f, @function
  6. f:
  7. .LFB2:
  8. pushl %ebp
  9. .LCFI0:
  10. movl %esp, %ebp
  11. .LCFI1:
  12. movl $0, %eax
  13. popl %ebp
  14. ret
  15. .LFE2:
  16. .size f, .-f
  17. .globl __gxx_personality_v0
  18. .ident "GCC: (GNU) 4.2.1 (SUSE Linux)"
  19. .section .note.GNU-stack,"",@progbits
用imdiff看时只有上面红色标志的是不同的,这是函数名字编译后的ID,C++ 丰富了内容。如果用extern “C”,告诉C++编译器,使用C的编译方式编译,这样就可以连接原来的用C编译出来的C文件了。现在模拟一个C++调用C库文件的现象。

C++ 调用C库
//t_add.c
  1. int add(int a, int b){
  2.         return (a+b);
  3. }
得到c的静态库文件t_add.o
  1. gcc -c t_add.c
原始的C头文件
  1. #ifndef T_ADD_C__
  2. #define T_ADD_C__

  3. int add(int a, int b);

  4. #endif
修改为可以被C++ 使用的头文件//t_add.h
  1. #ifndef T_ADD_C__
  2. #define T_ADD_C__

  3. extern "C" int add(int a, int b);

  4. #endif
可以被C++文件引用了,如//main.cpp
  1. #include <stdio.h>
  2. #include "t_add.h"

  3. int main(void)
  4. {
  5.         printf("1 + 2 = %d\n", add(1,2));
  6.         return 0;
  7. }
可以编译了
  1. g++ t_add.o main.c
输出
  1. 1 + 2 = 3

使用方式
当然了,extern “C”的方式多种,
  1. 可以在函数前,
  2. 文件开始结尾 {}hold住,
  3. 也可以方便的在 #inldue语句加,如
    1. extern "C" {
    2.         #include "t_add.h"
    3. }
另外,C++变压器会有 __cplusplus 的宏定义,一般都是结合使用

参考:
  1. http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html

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