与来自 time.h 的标识符'clock'冲突。
Clash with identifier 'clock' from time.h
以下程序
#include <ctime>
struct clock {};
int main() {
clock c;
}
在g++ 5.4和clang 3.8 (Ubuntu 64位)上编译失败。
g++输出clock.cpp: In function ‘int main()’:
clock.cpp:6:11: error: expected ‘;’ before ‘c’
clock c;
^
叮当声输出clock.cpp:6:5: error: must use 'struct' tag to refer to type 'clock' in this scope
clock c;
^
struct
/usr/include/time.h:189:16: note: struct 'clock' is hidden by a non-type declaration of 'clock' here
extern clock_t clock (void) __THROW;
^
1 error generated.
诊断在形式上略有不同,但与相同的问题相关。标准C函数clock
与程序中定义的同名结构体之间存在冲突。time.h
的相关声明:
extern clock_t clock (void) __THROW;
问题是:既然程序包含<ctime>
,那么这些符号不应该在std
命名空间中吗?有趣的是,这个声明位于宏__BEGIN_NAMESPACE_STD
之后的几行。此外,在<ctime>
中,可以看到:
namespace std
{
using ::clock_t;
using ::time_t;
using ::tm;
using ::clock;
...
}
这里有什么bug吗?
谢谢。
问题是:这样的符号不应该在
std
命名空间中…
是的,他们是。不幸的是,c++标准还允许实现将C库派生的头文件中的名称放在全局命名空间中。在本例中,您得到std::clock
和 ::clock
。
这适用于所有<c*>
c++头文件和相应的C语言<*.h>
版本。
相关文章:
- 写入位置0x0000000C时发生访问冲突
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 链表中写入访问冲突的未知原因
- 使用 SendInput 或 mouse_event 不适用于 clock()?
- C++中的openCV Mat访问冲突
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- C++尝试深度复制唯一指针时出现内存访问冲突
- 错误:使用通用引用的声明冲突
- 如何解决GTest和LibTorch联动冲突
- 两个运营商的一些奇怪的冲突<<
- 如何在多个线程中创建 QSql数据库连接时防止名称冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- C++17 十六进制浮点文字单精度后缀冲突?
- 结构字段名称与 GDB 中的 STL 数组冲突
- 写入访问冲突异常
- 与来自 time.h 的标识符'clock'冲突。