#define指令中的C类型转换

时间:2018-10-16 20:22:59

标签: c casting c-preprocessor

我已经看到许多使用类型转换的文字定义。 例如#define THE_ANSWER ((uint8_t) 42)

直到现在,我几乎无法想象这真的很重要的情况。

有人可以给我一个例子,其中没有类型强制转换的#define指令会导致“意外”行为。 也许有一个很好的桌面环境示例,而一个嵌入式或微控制器环境示例。

谢谢您的建议。

1 个答案:

答案 0 :(得分:1)

一个例子是乘法。假设您具有以下条件:

#define KILO 1024

如果稍后再执行以下操作会发生什么?

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

您可能会认为乘法将使用类型unsigned long long进行求值,但实际上所有这些乘法都发生在int上。因此,如果您的指令没有类型转换,或者更好的是它不是1024L,则可能会由于int溢出而导致意外行为,即使变量的类型实际上可以保存结果