(C++11) G++ 在使用 CSTDINT 类型时不提供适当的警告'incorrectly'
(C++11) g++ not providing a proper warning if cstdint types are used 'incorrectly'
今天我尝试了cstdint头文件中定义的一些类型: std::uint16_t
、std::uint_least16_t
等等。
我认为它们非常有用,因为您确切地知道或至少知道它们有多大,这与更常见的特定于平台的:int
、unsigned int
等。但是有一个问题我认为会导致许多错误。
假设我们有以下代码:
#include <cstdint>
#include <iostream>
int main()
{
std::uint_fast16_t test = 0;
test = 65536;
std::cout << test;
return 0;
}
我们知道std::uint_fast16_t
应该至少为 2 个字节。
如果uint_fast16_t
正好是 2 个字节,则此代码会因为溢出而发出警告。但就我而言,uint_fast16_t
是 8 个字节(之前检查过)。
所以在我的情况下,这段代码编译并运行良好,在其他情况下,我们会收到警告。我们的代码不可移植。这对我来说是错误的。即使变量可以保存该数据,编译器至少应该给我们一个警告或建议我们使用更大的类型。我说的对吗?还是我误解了这些类型的目的?
我使用这些标志使用 g++ 编译代码
-Wall -Werror -pedantic -std=c++0x
编译器
无法提供任何其他警告,因为这些类型是 typedef,并且它们被视为与它们同义词的类型完全相同。这就是C++的工作方式。您必须UINT_FAST16_MAX
并且可能std::numeric_limits<std::uint_fast16_t>::max()
告诉您此类型可以容纳的最大值。使用这些信息是您的工作。
还要记住,stdint 定义的大多数类型实际上是可选的,因此只需使用它们而不检查它们是否存在,您就会使代码不可移植。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在未链接的部分上生成警告
- 警告 C4552:">>":未使用表达式的结果
- 禁止显示由于常量为零而比较始终为假的警告
- C++ 警告:将新创建的 gsl::owner<> 分配给非所有者
- (C++11) G++ 在使用 CSTDINT 类型时不提供适当的警告'incorrectly'