c/c++ extern “C”

常见的样式

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 的宏定义,一般都是结合使用

c/c++ extern “C”的更多相关文章

  1. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  2. const extern static 终极指南

    const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...

  3. 16-static和extern关键字2-对变量的作用

    上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问:extern用来定义和声明一个外部函数,允许其他文件访问.static和extern对变量也有 ...

  4. 15-static和extern关键字1-对函数的作用

    一.extern与函数 如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.ob ...

  5. 转:C++项目中的extern "C" {}

    引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: #ifdef __cplusplus extern "C" { #endif /*...*/ #ifdef __c ...

  6. extern "c"用法解析

    转自: extern "c"用法解析 - 简书 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言, ...

  7. extern

    gcc编译器编译程序有四个阶段,预处理.编译.汇编.链接.预处理阶段会将源代码中的包含的头文件如stdio.h编译进来:编译阶段,gcc首先要检查代码的规范性.是否有语法错误等,以确定代码的实际要做的 ...

  8. 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)

    李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...

  9. extern用法总结

    在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的,要在此处引用".1. extern修饰变量的声明. 如果文件a.c需要引用b.c中变量 ...

  10. 链接(extern、static关键词\头文件\静态库\共享库)

    原文链接:http://www.orlion.ga/781/ 一. 多目标文件的链接 假设有两个文件:stack.c: /* stack.c */ char stack[512]; int top = ...

随机推荐

  1. MyPanel与QWidget使用QStyle设置背景色的不同

    -----------   MainWindow.h ------------------- class MyPanel: public QWidget{    Q_OBJECTpublic:     ...

  2. or1200构建sopc系统之软件环境搭建

    使用预先编译好的工具链 下载: ftp://ocuser:oc@195.67.9.12/toolchain/or32-elf-linux-x86.tar.bz2 解压 tar xjf or32-elf ...

  3. android4.0蓝牙使能的详细解析 (转载)

    此博客是转载过来的哦... 给自己博客定几个部分: (1)写在前面的话:一些写博客时的废话. (2)内容简介:把文章的主要内容或者核心部分作一个框架性的概括,以方便大家阅读. (3)正文:这个不需要解 ...

  4. PHP - 点击更换头像

    原理: 操作流程: 首先点击头像图片,弹出选择窗口,选中其中一个则窗口推出头像更换. 效果: 主页面代码: <tr> <td>头像:</td> <td> ...

  5. perl 取类里的成员变量

    [root@wx03 test]# cat x1.pm package x1; use Data::Dumper; sub new { my $self ={}; my $invocant = shi ...

  6. codeforces 148D 概率DP

    题意: 原来袋子里有w仅仅白鼠和b仅仅黑鼠 龙和王妃轮流从袋子里抓老鼠. 谁先抓到白色老师谁就赢. 王妃每次抓一仅仅老鼠,龙每次抓完一仅仅老鼠之后会有一仅仅老鼠跑出来. 每次抓老鼠和跑出来的老鼠都是随 ...

  7. C++辛格尔顿

    设计模式是编程的焦点.经常在面试时进行审查,Singleton模式是最简单的.最常见的.大部分的主模式.所以大部分的采访是测试考试的Singleton设计模式. 以下我们就来看看单例模式怎样实现(C+ ...

  8. HTML5 Canvas自定义圆角矩形与虚线(Rounded Rectangle and Dash Line)

    HTML5 Canvas自定义圆角矩形与虚线(RoundedRectangle and Dash Line) 实现向HTML Canvas 2d context绘制对象中添加自定义的函数功能演示,如何 ...

  9. 微软vs2015先行,Visual Studio 2015正式版离线iso及在线下载(附key)附带百度云盘地址

    win10正式版发布之前我们迎来了vs2015正式版,迫不及待要下载朋友可以看看 Visual Studio Community 2015简体中文版(社区版,针对个人免费): 在线安装exe:http ...

  10. 基于visual Studio2013解决C语言竞赛题之1053洗牌

       题目 解决代码及点评 /* 功能:洗扑克牌.将54张牌分别编号为1,2,-,54号,并放在数组M中. 洗牌方法如下:产生[1,54]区间内的一个随机数K,将M[1]与M[K]交换: ...