使用默认参数重载 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 上对此进行了测试。我可以依赖这种行为吗?是否在任何地方记录?
这样做会导致未定义的行为。
[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
函数。
此代码:
#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 上对此进行了测试。我可以依赖这种行为吗?是否在任何地方记录?
这样做会导致未定义的行为。
[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"
andextern "C++"
linkage, or as a name of namespace scope in the global namespace.
int abs(int)
正是这样一个函数签名。你在这里踩到了标准库,程序的行为是未定义的。
您不能在全局命名空间中定义这样的 abs
函数。