簡體   English   中英

為什么std :: uint32_t與uint32_t不同?

[英]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.

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