[development] __attribute__((weak))是干嘛的
简单的说,就是当发生 “重复定义的时候”。被声明者会被冲突者覆盖掉。
这里还涉及了weak与alias连用的情况。
参见,里边有两个例子,很浅显易懂。
https://my.oschina.net/senmole/blog/50887
还有一个用法是,让未定义的函数在没实现的情况下,不影响程序的编译。
我自己写了个例子,如下:
[root@D128 examples]# cat test.c
#include <stdio.h>
#include <stdint.h> #ifdef _WEAK
extern void test_func2() __attribute__((weak));
#else
extern void test_func2();
#endif void test_func()
{
test_func2();
} int main()
{
return ;
}
[root@D128 examples]# gcc test.c
/tmp/ccm6AoTE.o: In function `test_func':
test.c:(.text+0xa): undefined reference to `test_func2'
collect2: error: ld returned exit status
[root@D128 examples]# gcc -D_WEAK test.c
[root@D128 examples]#
但是,后一种的这个用法是一个很不推荐的用法,因为隐藏了不应该出现的错误。
在这种使用情况下,应该一定同时实现一个默认的函数。
[root@D128 examples]# cat test.c
#include <stdio.h>
#include <stdint.h> #ifdef _WEAK
extern void test_func2() __attribute__((weak));
#else
extern void test_func2();
#endif void test_func()
{
test_func2();
} int main()
{
test_func();
return ;
}
错误如下:
[root@D128 examples]# ./a.out
Segmentation fault (core dumped)
[development] __attribute__((weak))是干嘛的的更多相关文章
- 弱符号__attribute__((weak))
弱符号是什么? 弱符号: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误.链接器会忽略弱符号,去使用普通的全局符号 ...
- __attribute__((weak, alias())))
参考gcc的reference: 弱符号: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误.链接器会忽略弱符号,去 ...
- __attribute__((weak))
情况是这样的,碰到一个棘手的问题:我们不确定外部模块是否提供一个函数func,但是我们不得不用这个函数,即自己模块的代码必须用到func函数: extern int func(void); ..... ...
- C:__attribute__ weak 的作用
关于 weak weak经常出现在各种c代码中,其作用是将当前文件的对应函数声明为弱函数符号,如果外部文件出现相同的函数名,最终编译出来的 文件会优先指向外部文件的函数符号: 通常需要使用__attr ...
- 值得注意的: c++动态库、静态库、弱符号__attribute__((weak))以及extern之间的关系
先说结论: ①:动态库优先级最差,如果同时有静态库和动态库,那么首先使用的是静态库函数. ②:如果只有两个或多个动态库,那么首先使用的是最开始链接的动态库函数: ③:弱符号函数在动态库中是起任何作用的 ...
- weak alias
Weak Alias 跟 Weak Reference 完全没有任何关系,不过是我在看到 Weak Reference 的时候想到的而已. Weak Alias 是 gcc 扩展里的东西,实际上是函数 ...
- gcc/g++中weak弱符号及alias别名
最近查看linux内核代码时,表现了一些编译器选项如__attribute_((weak)).__attribute__( (alias("target"))),一开始不了解,后来 ...
- C语言之强化,弱化符号weak
一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号. 对于它们,下列三条规则使用: ① 同名的强符号只能有一个,否则编译器报"重复定义&q ...
- linux内核中GNU C __attribute__ 机制的实用
很多东西,只看看是不行的,要想深入的去了解一个东西,一定要去不断地学习,实践,反思. 说白了就是要去打磨. 在linux中,最近遇到了这样一个定义: int board_usb_init(int in ...
随机推荐
- 用Jmeter+Badboy+Fiddler做接口测试
用Jmeter+Badboy+Fiddler做接口测试 2016-12-05 目录: 1 简介2 Badboy录制3 Jmeter打开Badboy脚本4 用Fiddler抓请求,补充完善脚本5 测试中 ...
- idea android 开发
plugins 勾上 插件即可
- (转)Windows系统白名单以及UAC机制
用户帐户控制 深入了解 Windows 7 用户帐户控制 Mark Russinovich 概览: 标准用户帐户 用户帐户控制 内容 UAC 技术 提升与恶意软件安全性 Windows 7 中的不 ...
- Fedora 21 安装 Budgie Desktop
最新文章:Virson's Blog Budgie Desktop 是一款自由开源桌面,是 Evolve OS 的默认桌面,Evolve OS 是一款 OpenSUSE 的衍生系统.Budgie De ...
- Log4j2在项目中的常用配置
~~~~~~~~~~~~~~~~~~~~log4j2.xml文件内容 <?xml version="1.0" encoding="UTF-8"?>& ...
- python concurrent.futures.Threadpoolexcutor的有界队列和无界队列
1.默认是无界队列,如果生产任务的速度大大超过消费的速度,则会把生产任务无限添加到无界队列中,这样一来控制不了生产速度,二来是会造成系统内存会被队列中的元素堆积增多而耗尽. 2.改写为有界队列 cla ...
- [PHP] 04 - Upload files
PHP date() 函数 参数定义了格式 <?php echo date("Y/m/d") . "<br>"; echo date(&quo ...
- [React] 15 - Redux: practice IM
本篇属于私人笔记. client 引导部分 一.assets: 音频,图片,字体 ├── assets │ ├── audios │ ├── fonts │ └── images 二.main&quo ...
- 06建造者模式Builder
一.什么是建造者模式 Builder模式也叫建造者模式或者生成器模式, 是由GoF提出的23种设计模式中的一种. Builder模式是一种对象创建型模式之一,用来 隐藏复合对象的创建过程,它把复合对象 ...
- 显示windows的音频的输入输出设备
#include "stdafx.h" /************************音频的输入输出设备**************************/ #include ...