"类型"象征常数?

时间:2012-11-22 17:02:21

标签: c

  1. 何时在符号常量/宏中包含类型转换是合适的,如下所示:

    #define MIN_BUF_SIZE ((size_t) 256)
    

    通过类型检查,这是一种让它更像真实变量的好方法吗?

  2. 何时使用LU(或LL)后缀是合适的:

    #define NBULLETS 8U
    #define SEEK_TO 150L
    

4 个答案:

答案 0 :(得分:4)

只要默认类型不合适,您就需要这样做。就是这样。

答案 1 :(得分:4)

在未应用自动转换的位置输入常量非常重要,特别是具有可变参数列表的函数

printf("my size is %zu\n", MIN_BUF_SIZE);
intsize_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
}

#definevariadic 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 xx & VALUE_1x & VALUE_2会非常不同的结果。

    • 对于L或LL后缀也是如此:常量将使用不同的位数。