工具与软件:
鉴于这种"简单"的代码截短:
if ( meta_data_size_announced != (uint16_t)(MIN_META_DATA_SIZE + name_size_from_meta_data() + custom_meta_data_size_from_meta_data() ) )
{
return reset_state();
}
为什么需要以上的转换(uint16_t 为!=运算符的右侧)? 我在!=运算符的左侧和右侧有值31、并期望该表达式产生 false、即使没有该转换也是如此。
MIN_META_DATA_SIZE 定义为:
#define MIN_META_DATA_SIZE ( \
1 /* Firmware Name Size */ \
+ 1 /* Firmware Major Version */ \
+ 1 /* Firmware Minor Version */ \
+ 2 /* Firmware Type */ \
+ 2 /* Hardware Type */ \
+ 8 /* Device ID */ \
+ 8 /* Flags / Reserved */ \
+ 4 /* Custom Meta Data Size */ )
`NAME_SIZE_FROM_META_DATA ()`和`CUSTOM_META_DATA_SIZE_FROM_META_DATA ()`声明如下:
static size_t name_size_from_meta_data(void); static uint32_t custom_meta_data_size_from_meta_data(void);
`meta_data_size_announced`是 uint16_t 类型的静态变量 `NAME_SIZE_FROM_META_DATA`在给定情况下返回4、`custom_meta_data_SIZE_FROM_META_DATA ()`返回0。
除了添加上述转换、我还找到了其他几种方法来获得所需的结果:
-禁用优化(而不是 --opt_level=4)
-删除对 `custom_meta_data_size_frome_meta_data ()`的调用
-使用另一个编译器,如 clang
我看到效果、用 20.2.2和 22.6.0版本的 TI 编译器。
提前感谢、此致、
Torsten