C程序能调用extern “C“声明的带默认参数的C++函数吗?

问题场景
C++函数带默认参数,并用 extern "C"导出为动态库,C程序能否直接调用并享受默认参数?

// mylib.cpp
extern "C" void foo(int a, int b = 0) { /* ... */ }

C程序试图只传一个参数:foo(42);—— 这是错误的。

快速实验

  1. 编译动态库:g++ -shared -fPIC mylib.cpp -o libmylib.so
    导出符号为 foonm -D可见),链接没问题。

  2. C程序调用单参数版本,编译链接通过,但运行时崩溃,因为 C编译器不会补全默认参数,调用栈/寄存器混乱。

根本原因
extern "C"只保证符号名兼容(链接层面)。

• 默认参数是 C++编译期的特性,编译器在调用点自动补全参数,但二进制中不存在“默认值”信息。

C编译器完全不知道默认参数,只按声明生成调用,参数数量不匹配导致未定义行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值