《C关键字分析》之extern用法
《C关键字分析》之extern用法
一、假设为三方提供库源码和头文件
1.共享库部分
sanf.c
- #include <stdio.h>
- int a;
- void hello(){
- printf("TK------_>>>>>this is hello\n");
- }
编译:gcc -shared -fPIC -o libsanf.so sanf.c
生成:libsanf.so
2.头文件
sanf.h
- extern int a;
- extern "C"{
- void hello();
- }
以上sanf.h和libsanf.so即为第三方给我们提供的可用资源。
二、如何使用
1.编译链接
main.cpp
- #include <stdio.h>
- #include "sanf.h"
- int main(){
- a = 1;
- printf("TK------->>>>a is %d\n",a);
- hello();
- return 0;
- }
编译:g++ -c main.cpp
g++ -o main main.o -lsanf -L.
结果:可执行文件main
2.运行
./main
- TK------->>>>a is 1
- TK------_>>>>>this is hello
三、说明函数添加extern "C"原因
1.我们看C语言sanf.c编译的库libsanf.so中hello的符号
readelf -a libsanf.so
- 47: 00000000000005cc 18 FUNC GLOBAL DEFAULT 11 hello
2.我们看C++语言main.cpp在不添加extern "C"时hello的符号
readelf -a main.o
- 13: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _Z5hellov
在这种情况下,静态链接时就会找不到符号。
3.C++语言main.cpp在添加extern "C"时hello的符号
readelf -a main.o
- 13: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND hello
在这种情况下,静态链接时就能找到符号。
原因:
C++语言支持函数多态,导致函数在编译后生成的符号与C不同。
《C关键字分析》之extern用法相关推荐
- C# 关键字extern用法
C# 关键字extern用法 修饰符用于声明在外部实现的方法.extern 修饰符的常见用法是在使用 Interop 服务调入非 托管代码时与 DllImport 属性一起使用:在这种情况下,该方法还 ...
- extern用法详解(转)
extern用法详解(转) 1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义. 另外,extern ...
- extern用法详解
[转]extern用法详解 Posted on 2011-08-16 11:15 单鱼游弋 阅读(98) 评论(0)编辑收藏 1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义 ...
- this关键字的四种用法
this关键字的四种用法 一.this.属性名 表示对象自己的属性使用this调用成员变量,解决变量与局部变量之间的冲突问题 1.实例分析 代码如下(示例): public class Person{ ...
- C/C++中 extern用法
一.定义和声明的区别 声明用来告诉编译器变量的名称和类型,而不分配内存,不赋初值. 定义为了给变量分配内存,可以为变量赋初值. 注:定义要为变量分配内存空间:而声明不需要为变量分配内存空间. 二.ex ...
- 、简述global关键字的作用_在C#编程中global关键字的作用及其用法
在C#编程中,global 是 C# 2.0 中新增的关键字,理论上说,如果代码写得好的话,根本不需要用到它.今天就为大家展示下global关键字的作用及其用法,希望对大家学习C#编程有所帮助. 假设 ...
- C#中using关键字的作用及其用法(转)
C#中using关键字的作用及其用法 using的用途和使用技巧. using关键字微软MSDN上解释总共有三种用途: 1.引用命名空间. 2.为命名空间或类型创建别名. ...
- 【零基础学Java】—final关键字与四种用法(二十九)
[零基础学Java]-final关键字与四种用法(二十九) 一.final关键字 final关键字代表最终.不可改变的 常见的四种用法: 可以用来修饰一个类 可以用来修饰一个方法 可以用来修饰一个局部 ...
- 【零基础学Java】—this关键字的三种用法+Java继承的三个特点(二十一)
[零基础学Java]-this关键字的三种用法+Java继承的三个特点(二十一) 一.this关键字的三种用法 在本类的成员方法中,访问本类的成员变量 在本类的成员方法中,访问本类的另一个成员方法 在 ...
最新文章
- windows版influxDB安装与配置
- 【网址收藏】k8s zookeeper-operator示例
- Python+OpenCV:直方图(Histograms)
- [转]谈谈团队的凝聚力
- Retrofit 使用flatmap操作符时处理错误、异常
- (对比PDF)Adobe Acrobat DC 离线对比PDF、draftable.com/compare 在线对比PDF
- 甲骨文超 IBM 成全球第二大软件公司
- 使用xml和java代码混合控制UI界面
- 扫雷游戏代码+代码分析
- postgres的brin索引
- 计算机的中央处理器CPU包括什么,中央处理器cpu由哪些组成 中央处理器的作用是什么...
- 从《人民的名义》看声纹识别技术在案件侦查中的应用
- 外挂、私服为何你们这么猖獗?
- PC端下载文件到本地
- 接口 和 http协议
- ftp服务器上传不了文件怎么办,ftp服务器怎么上传不了文件
- UVA10115- Automatic Editing
- python生成二维码,实现零件履历表(微信小程序+python后端+mysql)
- 《超越平凡的平面设计: 版式设计原理与应用》—设计,无需规则
- 大型会议的礼仪(2)