强符号和弱符号及应用场景

在C语言中,编译器将没有初始化的全局变量定义作为弱符号处理,将初始化的全局变量定义作为强符号处理。在链接的时候不允许多个相同的强符号出现,但是允许一个强符号和多个弱符号同时出现,或者只有多个弱符号。

但是在C++中,为了维护单定义原则,初始化和未初始化的全局变量都会被当成强符号对待。

强符号 弱符号
C 初始化的全局变量定义 未初始化的全局变量定义
C++ 初始化或未初始化的全局变量定义 显示定义 __ attribute __ ((weak))
强符号 弱符号
强符号 不允许多个相同强符号同时存在 允许一个强符号和多个弱符号同时存在
弱符号 允许一个强符号和多个弱符号同时存在 允许多个弱符号同时存在,但是最终链接器会选择占空间最大的那个

下面着重介绍一下C++中弱符号的使用方法和应用场景:

使用方法

1. 错误使用-未显示声明弱符号

cpp 复制代码
//--------------main.cpp-----------------
#include <iostream>

int var_strong = 1;
int main()
{
    std::cout << var_strong  << std::endl;
    return 0;
}
//---------------------------------------

//--------------other.cpp----------------
double var_strong = 4.0;
//---------------------------------------
bash 复制代码
cmake_minimum_required(VERSION 3.10)
Project(Modern)

add_executable(Modern src/main.cpp src/other.cpp)

构建过程中会出现链接器报错-重复定义 ,因为C++中将这两个var_strong 都看成了强符号。

2. 正确使用-显示声明弱符号

cpp 复制代码
//--------------main.cpp-----------------
#include <iostream>

int var_strong = 1;
int main()
{
    std::cout << var_strong  << std::endl;
    return 0;
}
//---------------------------------------

//--------------other.cpp----------------
int var_strong __attribute__((weak))= 4;
//---------------------------------------

应用场景

相比现代C++,使用弱符号会减少运行时的选择耗时。

1. 需要零开销运行时的嵌入式系统

cpp 复制代码
// 链接脚本中常用
__attribute__((weak, alias("default_handler")))
void UART_IRQHandler(void);

// 用户可选覆盖
void UART_IRQHandler(void) __attribute__((alias("my_uart_handler")));

2. 编译器/工具链内部

cpp 复制代码
// 工具链提供的默认new/delete处理
__attribute__((weak))
void* operator new(std::size_t size) {
    if (void* ptr = std::malloc(size)) return ptr;
    throw std::bad_alloc();
}

3. 跨平台抽象层

cpp 复制代码
// platform_abstraction.h
__attribute__((weak))
void platform_specific_function();

// 平台实现1
void platform_specific_function() { /* Linux实现 */ }

// 平台实现2(不同文件)
void platform_specific_function() { /* Windows实现 */ }
相关推荐
Chester_19995 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
会周易的程序员6 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
小灰灰搞电子7 小时前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
QT界面美化性能优化7 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
学习星球9 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
小灰灰搞电子10 小时前
C++ 引用折叠详解
c++
布莱克60510 小时前
数组详解:定义、作用、应用场景及与链表的区别(C/C++ 代码讲解)
c语言·开发语言·c++·数组
牛油果子哥q11 小时前
C++内存池与对象池精讲:内存碎片、自定义分配器、对象池实现、STL allocator原理、工程落地与性能对比
java·开发语言·c++
万法若空12 小时前
C/C++ 类型别名定义方式对比
java·c语言·c++
小小晓.13 小时前
C++ 值类别与完美转发深度剖析:从左值右值到 std::forward 源码解密
开发语言·c++·算法