重载内置(内在?)功能

αλε*_*λυτ 4 c++ gcc clang built-in visual-c++

考虑以下代码:

#include <iostream>
#include <math.h>

double log(double) { return 42; }

int main() {
    std::cout << log(1) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

构建调试版本时所有使用的编译器(msvc,gcc,clang)打印42.

但是当我在发布模式下尝试构建(并运行)时,我得到了:

  • msvc中的编译错误:error C2169: 'log' : intrinsic function, cannot be defined;
  • 打印42gcc;
  • 0为铿锵打印.

为什么同一编译器的发布/调试结果不同?

为什么在发布模式下为不同的编译器获得不同的结果?

Col*_*mbo 5

您正在定义已<math.h>使用外部链接声明的函数.

C11标准,§7.12.6.7:

#include <math.h>
double log(double x);
Run Code Online (Sandbox Code Playgroud)

§7.1.2:

任何库函数声明都应具有外部链接.

[extern.names]/3:

使用外部链接声明的标准C库中的每个名称都保留给实现,以用作名称空间std和全局命名空间中具有extern"C"链接的名称.

根据[reserved.names]/2,行为未定义; 因此,实现可以做它想要的,包括发布无意义的错误消息.