为什么使用#define而不是一个variables
#define
在C ++中有什么意义? 我只看到它被用来代替“幻数”的例子,但我没有看到把这个值赋给一个variables的意义。
这些天大多是文体。 当C年轻的时候,不存在常量variables。 所以,如果你使用了一个variables而不是#define
,那么你不能保证某个地方的某个人不会改变它的价值,从而在整个程序中造成混乱。
在过去,FORTRAN甚至通过引用将常数传递给子程序,并且有可能(和令人头痛的诱导)将常量的值改变为“2”,这是不同的。 有一次,这发生在我正在编写的程序中,唯一的提示是我们遇到了一些问题,当程序遇到本应该正常结束的STOP 999
时,我们会收到一个ABEND(exception结束)。
#define
是C和C ++的预处理语言的一部分。 当他们用在代码中时,编译器会用你想要的任何东西replace#define
语句。 例如,如果您不时for (int i=0; i<=10; i++)
编写for (int i=0; i<=10; i++)
,您可以执行以下操作:
#define fori10 for (int i=0; i<=10; i++) // some code... fori10 { // do stuff to i }
如果你想要更通用的东西,你可以创build预处理macros:
#define fori(x) for (int i=0; i<=x; i++) // the x will be replaced by what ever is put into the parenthesis, such as // 20 here fori(20) { // do more stuff to i }
对于条件编译( #define
的另一个主要用途),如果你只想在特定的构build中使用某些代码,这也是非常有用的:
// compile the following if debugging is turned on and defined #ifdef DEBUG // some code #endif
大多数编译器将允许你从命令行定义一个macros(比如g++ -DDEBUG something.cpp
),但是你也可以在你的代码中定义一个定义如下:
#define DEBUG
一些资源:
- 维基百科的文章
- C ++特定的网站
- 关于GCC预处理器的文档
- 微软参考
- C特定的网站 (我不认为它不同于C ++版本虽然)
我一次在工作上遇到麻烦。 我被指控在数组声明中使用“幻数”。
喜欢这个:
int Marylyn[256], Ann[1024];
公司的政策是避免这些神奇的数字,因为有人向我解释,这些数字是不可移植的; 他们阻碍了容易的维护。 我争辩说,当我阅读代码时,我想知道这个数组有多大。 我失去了这个观点,所以在星期五的下午,我用#definesreplace了这个有问题的“魔法数字”,就像这样:
#define TWO_FIFTY_SIX 256 #define TEN_TWENTY_FOUR 1024 int Marylyn[TWO_FIFTY_SIX], Ann[TEN_TWENTY_FOUR];
在接下来的星期一下午,我被召来,被指控有被动的违抗倾向。
C没有使用const,因此#defines是提供常量值的唯一方法。 C和C ++现在都有它们,所以除了要用#ifdef / ifndef进行testing之外,没有必要使用它们。
#define
可以完成一些C ++不能正常工作的工作,比如守护头文件和其他任务。 但是,它绝对不应该被用作幻数 – 应该使用一个静态常量。
最常见的用法(除了声明常量外)是一个包含警卫 。
Define在预处理器编译之前被评估,而variables在运行时被引用。 这意味着您可以控制应用程序的构build方式(而不是运行方式)
下面是一些使用定义的例子,它们不能被一个variables替代:
-
(i,j)(((i)<(j))?(i):(j))
注意这是由预处理器评估的,而不是在运行时期间
#define
允许你在头文件中build立一个值,否则它会被编译为大于零的大小。 你的头文件不能编译为size-zero-zero。
// File: MyFile.h // This header will compile to size-zero. #define TAX_RATE 0.625 // NO: static const double TAX_RATE = 0.625; // NO: extern const double TAX_RATE; // WHAT IS THE VALUE?
编辑:正如Neil在这篇文章的评论中指出的那样,头文件中的显式定义与值将适用于C ++,而不是C.