簡體   English   中英

從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;

問題是:這些符號不應該在std命名空間中,因為程序包含<ctime> 有趣的是,在一個讀取__BEGIN_NAMESPACE_STD的宏之后,這個聲明位於幾行之后。 另外,在<ctime> ,可以看到:

namespace std
{
    using ::clock_t;
    using ::time_t;
    using ::tm;

    using ::clock;
    ...
}

這里有什么問題嗎?

謝謝。

問題是:這些符號不應該在std命名空間中......

是的,他們是。 不幸的是,C ++標准還允許實現將來自C庫派生頭的名稱放在全局命名空間中。 在這種情況下,你得到std::clock ::clock

這適用於C中具有相應<*.h>版本的所有<c*> C ++標頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM