Я определяю 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
без кастинга?
(void *)0
. Обратите внимание, что это отличается от C++, где вы можете просто определить его как0
. - person Paul R   schedule 28.03.20110u
является константой нулевого указателя как в C, так и в C++.(void*)0
является константой нулевого указателя в C, но не в C++. Неясно, предназначено лиNULL_PTR
иметь тип указателя или быть нулевой константой указателя, поэтому я ничего против не имею, что это(void*)0
, но, предположительно, такое определение вызовет срабатывание правила Misra и так что тут все равно не вариант. В C++ он в значительной степени должен быть целым типом, чтобы быть полезным, поскольку нет неявного преобразования изvoid*
в другие типы указателей, поэтому(void*)0
нельзя присвоить без приведения. - person Steve Jessop   schedule 28.03.2011int
, а не другой целочисленный тип. Если Misra запрещает кастинг, то вы в значительной степени облажались, вам придется создать временную переменную-указатель, чтобы содержать значение. То же самое относится и к непрототипным вызовам функций, но, конечно же, Misra запрещает и их? - person Steve Jessop   schedule 28.03.2011(void *)0
? Это выражение гарантировано создает константу нулевого указателя. - person u0b34a0f6ae   schedule 08.11.2011