C 和 C++ 是否都支持函数的重载?

只有 C++ 支持函数重载,C 语言不支持函数重载。

从语言特性和编译器实现两个层面来解释:

1. 语言层面的规定

  • C 语言:不允许在同一作用域内定义同名函数。如果出现两个同名函数,编译器会直接报"重复定义"错误。

  • C++:允许在同一作用域内定义多个同名函数,只要它们的参数列表不同(参数个数、类型或顺序不同)。注意:仅返回值类型不同不构成重载。

cpp 复制代码
// C++ 合法
int add(int a, int b);
double add(double a, double b);
cpp 复制代码
// C 非法,编译报错
int add(int a, int b);
double add(double a, double b);

2. 底层原因:名字修饰(Name Mangling)

C 和 C++ 编译后,函数名在符号表中的处理方式不同:

  • C 语言:函数名在符号表中基本就是原名字,如 `add`。如果有两个 `add`,链接时符号冲突,无法区分。

  • C++:编译器会把函数名和参数类型一起编码成唯一的符号名(名字修饰)。例如:

  • `add(int, int)` → `_Z3addii`

  • `add(double, double)` → `_Z3adddd`

因为符号名不同,链接器能够区分它们,所以重载得以实现。

3. 补充:`extern "C"`

在 C++ 中,如果希望某个函数按 C 的方式编译(不进行名字修饰),可以用 `extern "C"` 声明:

cpp 复制代码
extern "C" int add(int a, int b);

被 `extern "C"` 修饰的函数 不能重载,因为它的符号名不再包含参数信息。这也是 C++ 调用 C 库函数时需要加 `extern "C"` 的原因。

相关推荐
悠仁さん4 小时前
【C++】AVL 树
c++
wuminyu5 小时前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
txxzjmzlh5 小时前
SpringBoot 配置⽂件
java·spring boot·spring
小徐不徐说5 小时前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
ragnwang5 小时前
Notes: Python pybind11 import C++ module
开发语言·c++·python
Wang's Blog5 小时前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
骑着蜗牛撵大象3276 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
独泪了无痕6 小时前
Hutool之LocalDateTimeUtil:让时间间隔操作如虎添翼
java
充值内卷7 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
三无少女指南7 小时前
从这里开始:Java 后端与 AI 工程的三条阅读路线
java·学习路线·ai工程