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

问题场景

C++函数带默认参数,并用 extern "C"导出为动态库,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

    导出符号为 foo(nm -D可见),链接没问题。

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

根本原因

• extern "C"只保证符号名兼容(链接层面)。

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

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

相关推荐
chenbingjie_c25 分钟前
C++ 模板进阶:从 “会用“ 到 “懂底层“(非类型参数・特化・分离式编译)
c++·后端
world781122636 分钟前
【C++】set 和 map
java·前端·c++·set·map
lunar_coder1 小时前
哈希扩展 -- 位图思想
c++·算法·哈希算法
沐晓时光1 小时前
C语言入门,深入理解指针(6)
c语言·开发语言
Navigator_Z2 小时前
LeetCode //C - 1306. Jump Game III
c语言·算法·leetcode
kiracrimson2 小时前
编码简述:内存里没有文字,只有一张对照表
开发语言·c++·二进制·计算机组成原理
磊磊cpp2 小时前
CRC8 校验原理与实现详解(附可交互动画演示)
c++·交互
Mortalbreeze3 小时前
0 - 1 BFS 算法详解:从基本原理到经典题目建模
数据结构·c++·算法·图论·宽度优先
进化中的刀盾兽5 小时前
从零实现 C++ Json-Rpc(十):把消息交给真实连接——MuduoConnection 与 ConnectionFactory
c++·rpc