c++ - 使用默认参数解决重载的外部 C 函数
问题描述
这段代码:
#include <stdlib.h> // int abs(int);
int abs(int i = 0) { return 42; }
int main() {
return abs(1); // Returns 42
}
退货42
。
编译器选择重载的 C++ 函数。我在许多版本的 g++/clang 上对此进行了测试。我可以依靠这种行为吗?它在任何地方都有记录吗?
解决方案
通过这样做,您会得到未定义的行为。
[extern.names]
4使用外部链接声明的 C 标准库中的每个函数签名都保留给实现,以用作具有
extern "C"
和extern "C++"
链接的函数签名,或作为全局命名空间中命名空间范围的名称。
int abs(int)
正是这样的功能签名之一。您在这里踩到标准库,程序的行为是未定义的。
您不能abs
在全局命名空间中定义这样的函数。
推荐阅读
- android - Android 的 PopupMenu 中未显示高程
- android - Android RelativeLayout zIndex 不工作(不再)
- linux - 期望命令在脚本的不同阶段挂起
- php - woocommerce 编辑帐户简码
- django - 创建没有外键数据库查找的 Django 模型对象实例
- ios - 在 Swift 中拉伸 UIView
- javascript - 如何以及使用什么在前端推送通知而无需重新加载
- php - 在处理付款之前在 woocommerce 中获取账单信息
- java - 用 mockito 监视 lambda
- python - 如果字典列表中有重复记录,如何添加值?