c/c++ extern “C”
c/c++ extern “C”
常见的样式
例子//t_extern_yes.cpp
- extern "C"
- {
- int f(void)
- {
- return 0;
- }
- }
//t_extern_non.cpp
- int f(void)
- {
- return 0;
- }
汇编
- gcc t_extern_non.cpp t_extern_yes.cpp
- 或者
- gcc t_extern_non.cpp t_extern_yes.cpp
得到
- .file "t_extern_non.cpp"
- .text
- .align 2
- .globl _Z1fv
- .type _Z1fv, @function
- _Z1fv:
- .LFB2:
- pushl %ebp
- .LCFI0:
- movl %esp, %ebp
- .LCFI1:
- movl $0, %eax
- popl %ebp
- ret
- .LFE2:
- .size _Z1fv, .-_Z1fv
- .globl __gxx_personality_v0
- .ident "GCC: (GNU) 4.2.1 (SUSE Linux)"
- .section .note.GNU-stack,"",@progbits
- .file "t_extern_yes.cpp"
- .text
- .align 2
- .globl f
- .type f, @function
- f:
- .LFB2:
- pushl %ebp
- .LCFI0:
- movl %esp, %ebp
- .LCFI1:
- movl $0, %eax
- popl %ebp
- ret
- .LFE2:
- .size f, .-f
- .globl __gxx_personality_v0
- .ident "GCC: (GNU) 4.2.1 (SUSE Linux)"
- .section .note.GNU-stack,"",@progbits
用imdiff看时只有上面红色标志的是不同的,这是函数名字编译后的ID,C++ 丰富了内容。如果用extern “C”,告诉C++编译器,使用C的编译方式编译,这样就可以连接原来的用C编译出来的C文件了。现在模拟一个C++调用C库文件的现象。
C++ 调用C库
//t_add.c
- int add(int a, int b){
- return (a+b);
- }
得到c的静态库文件t_add.o
- gcc -c t_add.c
原始的C头文件
- #ifndef T_ADD_C__
- #define T_ADD_C__
- int add(int a, int b);
- #endif
修改为可以被C++ 使用的头文件//t_add.h
- #ifndef T_ADD_C__
- #define T_ADD_C__
- extern "C" int add(int a, int b);
- #endif
可以被C++文件引用了,如//main.cpp
- #include <stdio.h>
- #include "t_add.h"
- int main(void)
- {
- printf("1 + 2 = %d\n", add(1,2));
- return 0;
- }
可以编译了
- g++ t_add.o main.c
输出
- 1 + 2 = 3
当然了,extern “C”的方式多种,
- 可以在函数前,
- 文件开始结尾 {}hold住,
- 也可以方便的在 #inldue语句加,如
- extern "C" {
- #include "t_add.h"
- }
c/c++ extern “C”的更多相关文章
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- const extern static 终极指南
const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...
- 16-static和extern关键字2-对变量的作用
上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问:extern用来定义和声明一个外部函数,允许其他文件访问.static和extern对变量也有 ...
- 15-static和extern关键字1-对函数的作用
一.extern与函数 如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.ob ...
- 转:C++项目中的extern "C" {}
引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: #ifdef __cplusplus extern "C" { #endif /*...*/ #ifdef __c ...
- extern "c"用法解析
转自: extern "c"用法解析 - 简书 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言, ...
- extern
gcc编译器编译程序有四个阶段,预处理.编译.汇编.链接.预处理阶段会将源代码中的包含的头文件如stdio.h编译进来:编译阶段,gcc首先要检查代码的规范性.是否有语法错误等,以确定代码的实际要做的 ...
- 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)
李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...
- extern用法总结
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的,要在此处引用".1. extern修饰变量的声明. 如果文件a.c需要引用b.c中变量 ...
- 链接(extern、static关键词\头文件\静态库\共享库)
原文链接:http://www.orlion.ga/781/ 一. 多目标文件的链接 假设有两个文件:stack.c: /* stack.c */ char stack[512]; int top = ...
随机推荐
- java--内部类访问final成员
局部类只能访问外包方法中的final成员.位于方法内部的局部类,可以访问局部类之外,外包方法之内的所以变量和方法,但是生命周期不同,延长生命周期的办法就是将变量设置为final类型. 1)从程序设计语 ...
- 高级UIKit-08(TCPSocket)
[day1001_MoviePlayer]:视频播放 需要导入MediaPlayer.framework - (void)viewDidLoad { [super viewDidLoad]; NSUR ...
- VC6.0 导入资源崩溃
等我以后挣钱了一定买正版! 最近学习Win32编程,为了锻炼自己,在网上下载了一个VC6.0作为开发工具,应该是兼容性的问题吧,VC6 经常闹毛病. 今天导入资源的时候VC6出现崩溃的现象. 马上寻求 ...
- python验证码识别
关于利用python进行验证码识别的一些想法 用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章.我大体看了一下,主要方法有几类:一类是通过对图片进行处 理,然后 ...
- winform 防止主界面卡死
总结网络上的解决方案:新线程=> 委托=> 主界面的异步更新方法(IAsyncResult BeginInvoke(Delegate method)),一句话就是通过委托调用另一个线程的异 ...
- CSS三角形制作样式
.triangle{ display: block; height: 0; position: absolute; width: 0; border: 9px solid; border-color: ...
- <转载>使CSS文字图片div元素居中方法之水平居中的几个方法
文字居中,文字垂直居中水平居中,图片居中,图片水平居中垂直居中,块元素垂直居中?当我们在做前端开发是时候关于css居中的问题是很常见的.情 况有很多种,不同的情况又有不同的解决方式.水平居中的方式解决 ...
- XML文件解析之--DOM与SAX
xml文件又称‘可扩展性标记语言’,可以对文档和数据进行结构化处理,从而能够在部门.客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发. 我们在进行web开发的时候离不开xml文件,xml ...
- Qt exe图标
1.首先准备一张ico照片,也可以通过http://www.ico.la/生成: 2.把ico照片拷贝到项目工程下,比如:“pic.ico” 3.在工程下,创建一个文件“myapp.rc”,用txt打 ...
- Spring MVC 的json问题(406 Not Acceptable)
原因 : 就是程序转换JSON失败. 在pom.xml 加上 <dependency> <groupId>com.fasterxml.jackson.core</grou ...