首页 > 解决方案 > 使用默认参数解决重载的外部 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 上对此进行了测试。我可以依靠这种行为吗?它在任何地方都有记录吗?

Wandbox上的来源

标签: c++overloadingoverload-resolutionlinkageextern-c

解决方案


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

[extern.names]

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

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

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


推荐阅读