为什么使用#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 

一些资源:

  1. 维基百科的文章
  2. C ++特定的网站
  3. 关于GCC预处理器的文档
  4. 微软参考
  5. 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替代:

  1. (i,j)(((i)<(j))?(i):(j))
    注意这是由预处理器评估的,而不是在运行时期间

  2. http://msdn.microsoft.com/en-us/library/8fskxacy.aspx

#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.