C常数

时间:2009-06-29 11:04:56

标签: c

如果我声明一个常数

“C中定义MONTHS = 12” 我知道预处理器指令将取代使用MONTHS,但是想知道是否分配了一个内存来存储12 ??,如果是,那么标签是什么以及数据类型是什么。

9 个答案:

答案 0 :(得分:20)

你很可能希望你的定义如下:

#define MONTHS 12

/* some code here... */

int payAnnual = payMonthly * MONTHS;

要回答您的问题,将不会使用任何内存。预处理器不知道诸如变量和存储器之类的概念。它本质上是一个自动文本编辑器。它将用符号替换符号MONTHS的任何出现。

由于预处理器非常笨,因此通常最好使用const变量。这为您提供了类型检查的好处,并且可以使编译器错误更容易阅读。只要你声明它是静态的,变量就会被优化掉。 (如果你没有在C中声明一个静态的全局变量,默认情况下会导出它,所以编译器不能完全优化它。)

static const int MONTHS = 12;

答案 1 :(得分:9)

语法实际上是:

#define MONTHS 12

否=允许签名。 MONTHS的编译代码中没有分配内存,也没有数据类型。

答案 2 :(得分:6)

预处理器只是对源代码进行符号更改。因此,代码的行为与您自己用12替换所有MONTHS的行为相同。因此,使用它不会对记忆产生影响。

使用预编译器定义是提高代码抽象级别的一种很好的方法,而不会影响性能。

问候

答案 3 :(得分:3)

没有为自己的预处理程序符号分配内存。如果您曾在某处使用它作为值,则会导致相关分配。

例如:

char something[1024*MONTHS];// 1024*12 bytes

否则常量永远不会超过编译时间。它没有数据类型。

答案 4 :(得分:3)

不是#define - 只需在预编译器到达编译阶段之前找到n替换它。它用整个源中的值替换符号的所有实例。然后编译器接管。
所以不要以为内存是分配的。

答案 5 :(得分:3)

关于C预处理器的重点在于它在编译任何代码之前使其成为替代品。所以#defined常量不会存储在它们定义的位置,只有在它们被使用时才会存储。

答案 6 :(得分:2)

它们的使用方式与实际整数相同,整数的普通文字类型用于宏名称出现在程序中的计算中。

就像你要申报

一样
#define FOO "bar"

然后FOO的出现将被替换为“bar”的典型用法,“bar”是指向映射到内存的程序的目标文件中字符串常量的某个位置的指针。

没有什么区别。

答案 7 :(得分:0)

没有

weeks = 12 * 4;

完全相同:

weeks = MONTHS * 4;

12 会记忆吗?不,因此 MONTHS 也没有。

答案 8 :(得分:0)

如果分配12取决于使用情况,并且与预处理器完全无关

Somefunction(MONTH);

将扩展为

Somefunction(12);

12这里必须存储在某个地方,在这个的情况下,它将被静态存储在可执行文件中。该类型可能取决于Somefunction作为参数的内容(或者编译器决定最适合此用法的内容)。 “12”没有已知的标签。

预处理在实际编译之前完成,正如某人已经写过的那样,它就像一个自动化的texteditor。因此编译阶段完全没有意识到预处理器的作用。