繁体   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