何时在符号常量/宏中包含类型转换是合适的,如下所示:
#define MIN_BUF_SIZE ((size_t) 256)
通过类型检查,这是一种让它更像真实变量的好方法吗?
何时使用L
或U
(或LL
)后缀是合适的:
#define NBULLETS 8U
#define SEEK_TO 150L
答案 0 :(得分:4)
只要默认类型不合适,您就需要这样做。就是这样。
答案 1 :(得分:4)
在未应用自动转换的位置输入常量非常重要,特别是具有可变参数列表的函数
printf("my size is %zu\n", MIN_BUF_SIZE);
当int
和size_t
的宽度不同而你不会进行演员表时,很容易崩溃。
但是你的宏还有改进的余地。我这样做是为了
#define MIN_BUF_SIZE ((size_t)+256U)
(请参阅那里的小+
标志?)
当这样给出时,宏仍然可以用在预处理器表达式中(#if
)。这是因为在预处理器中(size_t)
评估为0
,因此结果也是无符号256
。
答案 2 :(得分:0)
#define
只是标记粘贴预处理器。
无论你在#define
中写什么,它都会在编译之前替换为替换文本。
所以无论哪种方式都是正确的
#define A a
int main
{
int A; // A will be replaced by a
}
#define
或variadic macro
#define
有很多变体
但是{{1}}的主要目标是上面解释的唯一目标。
答案 3 :(得分:0)
明确指出常量中的类型在Kernighan和Richie C中更为相关(在ANSI / Standard C及其函数原型出现之前)。
double fabs(double value);
之类的函数原型现在允许编译器在需要时生成正确的类型转换。
在某些情况下,您仍希望明确指出常量。我现在想到的例子是位掩码:
#define VALUE_1 ((short) -1)
可能是16位长,而#define VALUE_2 ((char) -1)
可能是8.因此,给定long x
,x & VALUE_1
和x & VALUE_2
会非常不同的结果。