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

相关推荐
zmzb010315 分钟前
C++课后习题训练记录Day199
开发语言·c++
LuminousCPP22 分钟前
数据结构-二叉树(三):堆复杂度证明与 Top-K 问题|错位相减推导 + 海量数据内存优化
c语言·数据结构·笔记·排序算法
人邮异步社区29 分钟前
如何系统地学习 C++ 语言?
开发语言·c++·学习
欧特克_Glodon38 分钟前
OpenCV计算机视觉开发入门与实践<二十>:非线性变换灰度变换
c++·人工智能·opencv·计算机视觉
1000世界小札6 小时前
《大话数据结构》第9章精读:归并排序与快速排序完整 C++ 实现
数据结构·c++·算法
2601_956121979 小时前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
fpcc9 小时前
跟我学C++中级篇——编译期的条件选择
开发语言·c++
ShineWinsu14 小时前
对于C++:C++20中线程、初始化、Lambda与内存视图等特性的解析
c++·c++20
张张的快乐时光呀!15 小时前
记录使用 MFC 打开文件对话框读取一张图片并做简单的灰度转换算法简单学习过程
c++·mfc
东华万里16 小时前
第41篇 C++类与对象核心知识梳理:从底层原理到面试实战
开发语言·c++·大学生专区