请考虑以下示例:
unsigned short c = // ...
if (c > 0xfffful)
c = 0xfffful;
Run Code Online (Sandbox Code Playgroud)
因为unsigned short实际上可能大于16位,我想将snprintf十六进制格式之前的值限制为固定大小的缓冲区.
然而,海湾合作委员会(但没有铿锵)发出警告:comparison is always false due to limited range of data type [-Wtype-limits].
这是海湾合作委员会的一个错误还是我错过了什么?据我所知,我的机器unsigned short上只有16位,但在其他平台上并不能保证这一点.
这看起来不像是一个错误(也许它可以被认为是一个有点幼稚的功能),但我可以理解为什么你想要这段代码以实现可移植性。
如果没有任何标准宏来告诉您平台上类型的大小(并且没有),我可能会在构建过程中采取一个步骤来解决该问题并将其传递给您的程序,如下所示一个-D定义。
例如在Make中:
if ...
CFLAGS += -DTRUNCATE_UINT16_LEAST_T
endif
Run Code Online (Sandbox Code Playgroud)
然后:
#ifdef TRUNCATE_UINT16_LEAST_T
if (c > 0xfffful)
c = 0xfffful;
#endif
Run Code Online (Sandbox Code Playgroud)
Makefile 条件取决于 中某个步骤的输出configure,或者执行其他一些仅打印出sizeofs 的 C++ 程序。遗憾的是,这排除了交叉编译。
从长远来看,我建议向 GCC 人员建议在使用这些特定类型别名时采取更智能的行为。