此代码:
#include <stdlib.h> // int abs(int);
int abs(int i = 0) { return 42; }
int main() {
return abs(1); // Returns 42
}
返回42
。
编译器选择重载的C++函数。我在g++/clang的许多版本上测试了这一点。我能相信这种行为吗?有记录吗?
Wandbox 上的来源
这样做会得到未定义的行为。
[extern.names]
4声明的C标准库中的每个函数签名具有外部链接的保留给实现,用作具有CCD_ 2和CCD_,或者作为全局名称空间中的名称空间范围的名称。
int abs(int)
正是这样一个函数签名。您在这里使用标准库,程序的行为是未定义的。
您不能在全局命名空间中定义这样的abs
函数。