我将NULL_PTR
定义为0U
然后使用此NULL_PTR
作为参数调用函数。
read_some_data(2U, (uint8_t *const) NULL_PTR, (uint8_t *const) NULL_PTR);
调用函数原型:
int16_t read_some_data(const uint8_t id, uint8_t *const data_1, uint8_t *const data_2);
在编译时,Misra引发了规则11.3违规错误。(不应在指针类型和整数类型之间执行强制转换。)
但如果我按照以下方式传递NULL_PTR
,则不会违反。
read_some_data(2U, NULL_PTR, NULL_PTR);
哪种方式更好?抑制Misra 11.3规则或只是传递NULL_PTR
而不进行投射?
答案 0 :(得分:3)
标准'NULL'有什么问题?
答案 1 :(得分:2)
如果可以避免,为什么选择投票? Cast总是让代码变得更脏一点,并暗示有一些hacky被执行。
所以我只是在没有强制转换的情况下传递NULL_PTR。 检查函数规范后,它可以接受NULL_PTR作为其第二个参数!!!
答案 2 :(得分:1)
我在头文件中使用NULL_PTR以避免使用定义NULL的IAR内部配置文件yvals.h。但这不是问题,因为我可能因为其他原因而不得不使用yvals.h。
无论使用NULL还是NULL_PTR,我都认为普遍的共识是在不进行转换的情况下传递NULL。我的功能在接受它时没有任何问题。这样,我可以避免压制Misra 11.3规则。
希望我正在以正确的方式前进。
答案 3 :(得分:1)
在编译时,Misra引发了规则11.3违规错误。
为了迂腐,MISRA没有引发违规错误,您的编译器引发了MISRA规则违规错误。
根据您发布的内容,我不相信所报告的违规行为是正确的......
另一方面,我个人将NULL_PTR
定义为(void *)0u
,因为(严格来说)0不是指针。