这段代码:
#include <stdlib.h> // int abs(int);
int abs(int i = 0) { return 42; }
int main() {
return abs(1); // Returns 42
}
退货42
。
编译器选择重载的 C++ 函数。我在许多版本的 g++/clang 上对此进行了测试。我可以依靠这种行为吗?它在任何地方都有记录吗?
这段代码:
#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
在全局命名空间中定义这样的函数。