1

这段代码:

#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上的来源

4

1 回答 1

1

通过这样做,您会得到未定义的行为。

[extern.names]

4使用外部链接声明的 C 标准库中的每个函数签名都保留给实现,以用作具有extern "C"extern "C++"链接的函数签名,或作为全局命名空间中命名空间范围的名称。

int abs(int)正是这样的功能签名之一。您在这里踩到标准库,程序的行为是未定义的。

您不能abs在全局命名空间中定义这样的函数。

于 2020-12-08T14:55:21.037 回答