代码编译没有错误,但time
无处声明。
幸运的是,当我将名称更改为mtime时,错误已经消失。但是错误的本质是什么?什么是time
?
该程序的输出是 1
.我想知道文件中是否有任何称为time
的东西iostream
或某处。
#include <iostream>
int main()
{
std::cout << time << std::endl;
return 0;
}
time_t time(time_t*)
函数的地址,因为您的<iostream>
实现包含time.h
标头。该地址永远不会为 NULL,并且可以隐式转换为布尔值,因此是 1
的结果。你可能在Linux上使用g++。
我的怀疑是它是time_t time(time*)
函数,其operator<<
最佳匹配是采用bool
的函数(函数指针只是远离bool
的隐式转换)。现在,假设它是一个指向实际有效函数的函数指针,它被转换为 true
,然后将其打印为 1
(如果未设置 boolalpha
标志,则默认将布尔值打印为 0/1)。
有 std::time
,但情况不应该如此,因为std
不是使用的命名空间。
所以,它必须是这个函数:
time_t时间(time_t*计时器);
它必须由iostream
标头隐式包含。
C++标准库函数在命名空间std
中定义。例如,需要<ctime>
标头才能提供std::time
功能。但实际上,此功能由底层 C 库提供,其中没有命名空间的概念。因此,C++标准库标头也允许在全局命名空间中定义某些函数。
引用 cpp首选项中的 C 兼容性标头部分:
包括
<cstdlib>
肯定提供std::malloc
,也可能提供::malloc。包括<stdlib.h>
肯定提供::malloc
,也可能提供std::malloc
。
因此,例如,在包含标准库标头后,time
函数可能碰巧在全局命名空间中定义。这是标准允许的,但特定于实现。
我发现了一个问题 为什么iostream包含time.h? 验证上面的答案并解释该功能出现的原因。这实际上是功能的工作time_t time(time_t * timer)
:)