Что касается вашего нового вопроса, #define
заменяется буквально текстом, который вы предоставляете.Поэтому
#define LANDING_COMMAND "2";
Заменит все варианты использования LANDING_COMMAND
на "2";
в тексте программы.Это, вероятно, не , что вы хотите.
Во-первых, директивы предварительной обработки не являются частью языка C, они являются частью препроцессора.Поскольку они не являются частью C, они не являются утверждениями, поэтому они не заканчиваются на ;
.Если вы оставите это, это, вероятно, вызовет проблемы, если вы собираетесь делать что-то вроде func(LANDING_COMMAND);
.
Во-вторых, "2"
имеет тип char *
, который не может быть преобразован в int16_t
с любымбезопасность.Вам нужно использовать литерал 2
для числового значения.
Наконец, для того, чтобы он набрал int16_t
, вам необходимо предоставить приведение (((int16_t)2)
) или использоватьмакрос INT16_C(2)
, который расширяется до литерала с соответствующим суффиксом, чтобы сделать его размером (и типом) int16_t
.Я рекомендую последнее, но первое должно работать .Макрос INT16_C(2)
можно использовать, но он расширяется до литерала (с соответствующим суффиксом) типа int_least16_t
, который близок, но без сигары.stdint.h
предоставляет только макросы для создания целочисленных константных литералов типов [u]int_leastN_t
и типов [u]intmax_t
, в более общем случае для типов [u]intN_t
или [u]int_fastN_t
.Почему они не за мной.