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编译器完全不知道默认参数,只按声明生成调用,参数数量不匹配导致未定义行为。

相关推荐
程序喵大人4 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
by209996 小时前
vector 的模拟实现:扩容与边界的详细阐述(下)
c++·经验分享·vector·动态数组
余额瞒着我当琳8 小时前
红黑树的实现--红黑树的概念、规则、效率、结构、旋转、查找、验证
数据结构·c++·算法
青少儿编程课堂9 小时前
AC自动机多模式串匹配精讲:校园关键词巡检实战解析
c++·python·算法·bfs·信息学竞赛
longlongzihan9 小时前
LeetCode 5. 最长回文子串:从暴力匹配到中心扩展的思维演进
c++·算法·leetcode
多弗朗皮卡丘9 小时前
C++继承
c++·继承
Escalating_xu10 小时前
【C 语言】深入理解指针(4):回调函数、qsort、void * 与泛型排序的模拟实现
java·c语言·开发语言
汉克老师10 小时前
GESP2026年9月认证C++七级( 第三部分编程题(2、括号序列))精讲
c++·gesp·小学生·学c++编程
吠品10 小时前
GitHub 周榜拆解:决策小模型扎堆上位
c语言·开发语言·算法
小师兄吃牛肉11 小时前
C语言篇:内联函数
c语言·开发语言