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

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

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

根本原因

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

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

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

相关推荐
xiangyun614 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun614 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
fpcc6 小时前
计算机原理—构建过程中的分段分析
c++
xxwxx__6 小时前
C++ AVL 树深度剖析:平衡二叉搜索树原理、源码与面试考点
数据结构·c++
Logic1016 小时前
C语言/数据结构数组题解:数字列表加一(Plus One)——进位处理与数组扩展
c语言·数据结构·模拟·数组·时间复杂度·算法题·进位
Escalating_xu6 小时前
【C语言常见概念】从第一行代码到字符串结束标志:一次打通编译、main、ASCII、转义字符与注释
c语言·c++
Navigator_Z6 小时前
LeetCode //C - 1250. Check If It Is a Good Array
c语言·算法·leetcode
bnmoel6 小时前
C++ 基础入门篇(三):内联函数与空指针
c++·内联函数·nullptr·低层
码匠许师傅6 小时前
【C++三方组件】TinyXML2:两个文件的极简 XML 解析器
xml·c++
free-elcmacom6 小时前
C++学习<1>程序分区
开发语言·c++