[英]Why is std::uint32_t different from uint32_t?
我對c ++有點新,我已經完成了很多文件的編碼工作,但是我注意到VS2012似乎有以下語句的問題:
typedef std::uint32_t identifier;
但是,似乎將其改為
typedef uint32_t identifier;
擺脫錯誤。 沒有包含,這是在頭文件中。 我注意到定義是在stdint.h中。 如果是這種情況,為什么這個代碼在VS之外是可以接受的(即使用g ++正確編譯)但在VS中是不可接受的? 有人可以解釋一下嗎?
區別在於一個在命名空間內,另一個不在。 否則他們應該是一樣的。 第一個應該是C版本,第二個是C ++版本。 在C ++ 11之前,強制要求包含前綴版本而不是C標准庫版本會在標准命名空間內引入所有C定義。 在C ++ 11中,這種限制已經放寬,因為這並不總是可行的。
可能是您的編譯器隱式定義了此類型。 在任何情況下,都應該包含cstdint
以使命名空間std
的版本可用(並且可能是全局命名空間中的版本)。 包括stdint.h
應該只使不合格的版本可用。
早期版本的Visual Studio沒有這個標題,所以這一定很麻煩。
由於所有這些瘋狂,大多數人將退回到第三方實施,如boost/cstdint.hpp
。
編輯:它們是相同的並且用於相同的目的。 通常:如果要在std
命名空間中使用該版本,請包含cstdint
。 如果您想要全局命名空間中的那個,請包含stdint.h
。 對於C ++,建議使用std
命名空間中的那個。 通常:始終包括您使用的內容,不要依賴其他標題,包括適合您的內容。
uint32_t
(aka ::uint32_t
即全局命名空間中的那個)在<stdint.h>
聲明。 這頭也可能宣布它在命名空間std
,因為std::uint32_t
,但這樣做不是必需的。
std::uint32_t
(即命名空間std
中的<cstdint>
)在<cstdint>
聲明。 這頭也可能宣布它在全局命名空間,如::uint32_t
,但這樣做不是必需的。
如果是這種情況,為什么這個代碼在VS之外是可以接受的(即使用g ++正確編譯)但在VS中是不可接受的? 有人可以解釋一下嗎?
如果要使用std::uint32_t
則必須#include <cstdint>
,否則代碼可能無法編譯。 如果它使用G ++進行編譯,那么可能其他一些標題間接包含<cstdint>
但您不應該依賴它,包括您使用的名稱的正確標題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.