2011-05-16 48 views

回答

4

一个define是一个简单的文本替换。 A const是只读存储器。例如,如果它是一个定义,则不能说&GOKU

编辑

我忘了类型检查和范围。使用const有时比使用define好,因为如果涉及操作中的常量,编译器可以检查类型。另外const服从范围,所以它不会污染你的名字空间。

+0

我可以使用一个变量称为GOKU,如果我把它作为#define? – Saad 2011-05-16 06:37:20

+0

@Saad可能不是。而不是'int GOKU',你可能会得到'int 9111'。 – cnicutar 2011-05-16 06:39:03

3

最明显的区别

#define GOKU 9111 

是,#定义由预处理器处理,而常数是由编译器处理。它们都不是在运行时定义的。当使用#define时,文本GOKU将在您的源代码中用9111替换,之后编译器将完成其工作。

2

预处理器常量仅在编译之前就已存在。事实上,它们都是在预处理过程中解决的,并且(如果您想),您只能执行预处理并查看结果。

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

请注意,如果你尝试过包括常量变量文件,它可能导致错误,如“符号GOKU定义multiplie倍”。

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

还有的代码是如何编制的问题。使用第一个GOKU会导致代码更快一些,指令中会生成正弦数字符号。使用第二个GOKU会导致代码慢一点,因为将间接指向变量放置在数据段中的位置。

这就是我可以立即召回。

+0

速度是一样的。自己检查装配。 (另外,这是一个C问题,所以没有'::'运算符。) – 2011-05-16 06:46:25

+0

我明白了。会做。 – Srv19 2011-05-16 06:53:23