Правило MISRA нацелено на то, что C не определяет точный размер, диапазон или представление своих стандартных целочисленных типов. Заголовок stdint.h
смягчает эту проблему, предоставляя несколько семейств определений типов выражающие целочисленные типы, поддерживаемые реализацией, которые обеспечивают определенные комбинации подписи, размера и представления. Каждая реализация C предоставляет заголовок stdint.h
, соответствующий этой реализации.
Вы должны соблюдать правило MISRA, используя типы, определенные в заголовке stdint.h
вашей реализации, выбирая типы, отвечающие вашим потребностям, среди тех, которые он действительно поддерживает (или тех, которые, как вы ожидаете, будут поддерживаться). Например, если вам нужен целочисленный тип со знаком шириной ровно 32 бита, без дополнительных битов и выраженный в виде дополнения до двух, то это будет int32_t
-- если ваша реализация вообще это обеспечивает (было бы удивительно, но не невозможно, чтобы такой тип был недоступен).
Например,
#include <stdint.h>
// relies on the 'int32_t' definition from the above header:
static int32_t handlerCalled = 0;
Вопрос, который я поднимал в своем комментарии, заключался в том, что вы, кажется, сказали, что не только включили заголовок, но и определили свой собственный typedef для uint32_t
. Вы не должны определять собственное определение типа для этого или других типов в области stdint.h
. В лучшем случае это избыточно, но в худшем случае это удовлетворяет требованиям программы проверки MISRA, но ломает ваш код.
person
John Bollinger
schedule
04.02.2019
stdint.h
, такие какint32_t
, если вам нужен 32-битный подписанный int, а неint
. - person Christian Gibbons   schedule 04.02.2019static int handerCalled = 0;
? Если это так, я совершенно уверен, что @ChristianGibbons прав в своем предположении. - person Morten Jensen   schedule 04.02.2019#include <stdint.h>
, но не должны писать собственное typedef дляuint32_t
. Используйте определения типов, представленные в заголовке, так как вы можете положиться на них, чтобы быть правильными для вашей конкретной системы. - person John Bollinger   schedule 04.02.2019uint32_t
предназначен для 32-битных чисел без знака, и поэтому никогда не должен быть преобразован в типint
, который является знаковым. Такие ошибки являются одной из причин, по которой, как настоятельно советовал @JohnBollinger, вам не следует самостоятельно выполнять определения типов.stdint.h
уже делает за вас все определения типов. Просто включите заголовок и используйте типы, которые он определяет. - person Christian Gibbons   schedule 04.02.2019