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

相关推荐
AmyLin_20012 小时前
PDF 色彩保真工程实践【3】上手实践:工程结构、依赖集成与一键构建运行
c++·visualstudio·pdf·zlib·vcpkg·libtiff·cmyk
LONGZETECH2 小时前
传统实训 vs 仿真实训:从技术架构拆解新能源汽车教学的范式之变
c语言·3d·unity·架构·汽车
并不喜欢吃鱼2 小时前
从零开始 C++------ 十六.深度拆解 C++ 智能指针:unique_ptr/shared_ptr/weak_ptr 底层模拟、内存泄漏根治
开发语言·c++
不相心 -w-2 小时前
Cmake的基础用法
linux·开发语言·c++
白白白小纯2 小时前
每日算法day3—回文链表,链表分割
c语言·数据结构·算法·leetcode
撑伞的鱼99372 小时前
C++开发用什么AI编程工具效果好?2026年实测横评(附选型指南)
开发语言·c++·ai编程·cursor
Nebula嵌入式3 小时前
【C语言】01-从零开始:编译运行与第一个程序
c语言·嵌入式
j7~3 小时前
【Linux】二十八.线程篇五《Linux多线程编程:线程同步之条件变量》---详解
linux·运维·c++·学习·条件变量·线程同步
王老师青少年编程3 小时前
2026年全国青少年信息素养大赛算法应用主题赛C++赛项【决赛】模拟卷3:文末附答案
c++·答案·模拟题·2026年·青少年信息素养大赛·算法应用主题赛·决赛