使用默认参数重载 extern C 函数的解析

Resolution of overloaded extern C function with default arguments

此代码:

#include <stdlib.h> // int abs(int);

int abs(int i = 0) { return 42; }

int main() {
  return abs(1); // Returns 42
}

Returns 42.

编译器选择重载的 C++ 函数。我在许多版本的 g++/clang 上对此进行了测试。我可以依赖这种行为吗?是否在任何地方记录?

Source on Wandbox

这样做会导致未定义的行为。

[extern.names]

4 Each function signature from the C standard library declared with external linkage is reserved to the implementation for use as a function signature with both extern "C" and extern "C++" linkage, or as a name of namespace scope in the global namespace.

int abs(int) 正是这样一个函数签名。你在这里踩到了标准库,程序的行为是未定义的。

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