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