为什么C库函数在任何C++代码中都显示为函数的指针?

gaa*_*kam 3 c++

当我试图弄清楚下面代码发生了什么时,我得出了这个结论:

#include <iostream>

int main()
{
  std::cout << (div) << '\n';
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

div上述可以与被取代printf,atoi,difftime等不论是否我#include荷兰国际集团的适当的报头(ctime,time.h,cstdlib,...,),我得到没有编译器错误和节目被打印1.当我用函数名称作为前缀时,程序没有编译std::.

Clang警告解释了发生了什么:

warning: address of function 'div' will always evaluate to 'true' [-Wbool-conversion]
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  • 为什么即使适当的标题不是#included ,C库函数的名称也没有任何意义?
  • 为什么它们被定义为函数的指针?
  • 为什么它们位于命名空间之外std

jua*_*nza 5

  • 允许标准库标题包含其他标题而不宣传该事实.
  • 这些是函数,它们的名称衰减到指向函数
  • 因为标准不幸允许将名称从C库导入全局名称空间,即使这些名称是在其中一个<cxxx>标题中定义的.