是预处理的象征常数?

时间:2011-05-16 06:25:48

标签: c macros

  

可能重复:
  “static const” vs “#define” in c

在C中是在编译时或运行时定义的符号常量吗?

符号常数之间的区别是什么:

#define GOKU 9111

vs const variables

int const GOKU = 9111;

3 个答案:

答案 0 :(得分:4)

define只是文字替换。 const是只读内存。例如,如果它是一个定义,你不能说&GOKU

修改

我忘记了类型检查和范围。使用const有时比使用define要好,因为如果在操作中涉及常量,编译器可以检查类型。此外const遵守范围,因此不会污染您的命名空间。

答案 1 :(得分:3)

最明显的区别是#define由预处理器处理,而const由编译器处理。它们都不是在运行时定义的。使用#define时,文字GOKU将在源代码中用9111替换,之后编译器将完成其工作。

答案 2 :(得分:2)

预处理器常量仅在编译之前存在。实际上,它们都在预处理期间得到了解决,并且(在你想要的情况下)你只能执行预处理并查看结果。

另一方面,const变量保留在编译程序中,因此可以在链接阶段找到。例如,您可以在另一个文件中定义“extern int const GOKU”,然后将其与第一个文件链接在一起以访问GOKU。

请注意,如果您尝试使用const变量包含文件,则可能会导致错误,例如“符号GOKU已定义乘法次数”。

可见度也有差异。虽然常量变量遵循嵌套命名空间的规则(也就是说,例如:如果它是全局的,它将在文件中的任何地方都可以看到,但它可以在任何代码块中重新定义),预处理器常量从它所在的行可见被定义为未定义的行(或文件的结尾)。当然,您可以取消定义(使用#undef)或重新定义(使用另一个#define)。

还有如何编译代码的问题。使用第一个GOKU将导致更快的代码,正则数字consant将在指令中构建。使用第二个GOKU会导致代码变慢,因为存在间接到变量放置在数据段中的位置。

这就是我能立刻回忆起来的。