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

在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实现 */ }
相关推荐
fpcc13 小时前
c++编程实践—堆和栈越界调试
c++
weiabc14 小时前
MSYS2 UCRT64 + g++ C++ 中文输出乱码 完整全过程
c++
灯澜忆梦16 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
aqiu11111117 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
chenbingjie_c18 小时前
C++ STL 适配器:stack & queue,从 vector/list 到 deque 深度解析
数据结构·c++
hetao173383721 小时前
2026-10-08 hetao1733837 的刷题记录
c++·算法
Frank_refuel21 小时前
【C++】智能指针
开发语言·c++
一只旭宝1 天前
数据结构与算法复习手册:从写过,到讲清楚
开发语言·数据结构·c++·算法
十五年专注C++开发1 天前
std::filesystem::exists 在有的win10系统抛异常原因分析
c++·文件系统·filesystem
hetao17338371 天前
2026-10-07 hetao1733837 的刷题记录
c++·算法