【问题标题】:Resolution of overloaded extern C function with default arguments使用默认参数解决重载的外部 C 函数
【发布时间】:2021-03-19 21:39:42
【问题描述】:

这段代码:

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

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

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

返回42

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

Source on Wandbox

【问题讨论】:

标签: c++ overloading overload-resolution linkage extern-c


【解决方案1】:

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

[extern.names]

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    相关资源
    最近更新 更多