在C中是在编译时或运行时定义的符号常量吗?
符号常数之间的区别是什么:
#define GOKU 9111
vs const variables
int const GOKU = 9111;
答案 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会导致代码变慢,因为存在间接到变量放置在数据段中的位置。
这就是我能立刻回忆起来的。