与来自 time.h 的标识符'clock'冲突。

Clash with identifier 'clock' from time.h

本文关键字:冲突 clock 标识符 time      更新时间:2023-10-16

以下程序

#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>版本。