Типы C в #define директивах - PullRequest
0 голосов
/ 16 октября 2018

Я видел много #defines для литералов, использующих приведение типов.Например, #define THE_ANSWER ((uint8_t) 42).

До сих пор я едва ли представляю ситуацию, когда это действительно имеет значение.

Может ли кто-нибудь привести пример, когда директива #define без приведения типа приводит к«неожиданное» поведение.Возможно, есть хороший пример для среды рабочего стола и один для встраиваемой или микроконтроллерной среды.

Спасибо за ваши предложения.

1 Ответ

0 голосов
/ 16 октября 2018

Одним из примеров является умножение.Скажем, у вас есть следующее:

#define KILO 1024

что произойдет, если вы позже выполните следующее?

unsigned long long val = KILO * KILO * KILO * KILO * KILO * ...

вы можете подумать, что умножение будет оцениваться с типом unsigned long long,но в действительности все эти умножения происходят на int.Так что, если ваша директива не имеет тип-трансляции или, что еще лучше, это не 1024L, вы можете столкнуться с неожиданным поведением из-за переполнения int, даже если тип вашей переменной может фактически содержать результат.

...