C++中如何处理extern函数的默认参数值?
C++函数默认参数冲突问题及解决方案
问题场景
- 基础函数定义:
void foo(int bar=99){}; - 在被#include的文件中尝试调用:
extern void foo(int); foo(); // 编译报错:foo()需要1个参数 - 修改后依然报错:
extern void foo(int=99); foo(); // 编译报错:默认值已被指定 - 需求:想让主程序和被#include的文件给
foo使用不同的默认参数,是否可行?
核心原因
C++标准明确规定:函数的默认参数只能在第一次对该函数的可见声明(包括定义,如果定义是编译器第一个看到的声明)中指定,后续所有声明都不能重复指定默认参数,更不能修改默认值。所以你第二次声明时加默认值会触发重复定义错误,不加默认值的话,编译器仅识别到extern void foo(int),会判定该函数必须传入参数,因此报错。
实现不同默认值的可行方案
直接给同一个函数在不同文件设置不同默认参数是不可行的,只能通过以下方式间接实现需求:
- 包装函数
为不同场景单独写包装函数,调用原函数时传入对应默认值:// 主程序中使用的包装 void foo_main() { foo(99); } // 被#include文件中使用的包装 void foo_include() { foo(100); } - 宏控制默认值
编译时通过宏指定不同默认参数,避免直接修改函数声明:
不同文件调用// 先把原函数改成不带默认参数的定义 void foo(int bar) {} // 主程序里定义宏 #define FOO() foo(99) // 被#include的文件中重新定义宏 #undef FOO #define FOO() foo(100)FOO()时,就会自动传入对应默认值。
内容的提问来源于stack exchange,提问作者RatherB
相关产品推荐
相关产品推荐

