C ++中#define
的重点是什么?我只看到了用它代替“幻数”的例子,但我没有看到只是将该值赋给变量的重点。
答案 0 :(得分:111)
#define
是C和C ++预处理器语言的一部分。当它们在代码中使用时,编译器只需将#define
语句替换为您想要的内容。例如,如果您厌倦了一直写for (int i=0; i<=10; i++)
,那么您可以执行以下操作:
#define fori10 for (int i=0; i<=10; i++)
// some code...
fori10 {
// do stuff to i
}
如果您想要更通用的东西,可以创建预处理器宏:
#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
的另一个主要用途)也非常有用:
// compile the following if debugging is turned on and defined
#ifdef DEBUG
// some code
#endif
大多数编译器允许您从命令行定义宏(例如g++ -DDEBUG something.cpp
),但您也可以在代码中添加一个定义,如下所示:
#define DEBUG
一些资源:
答案 1 :(得分:42)
这些天大多是风格。当C年轻时,没有const变量这样的东西。因此,如果您使用变量而不是#define
,则无法保证某个人不会改变它的值,从而在整个程序中造成严重破坏。
在过去,FORTRAN通过引用将偶数常量传递给子例程,并且可能(并且令人头疼)将类似'2'的常量值更改为不同的值。有一次,这发生在我正在进行的一个程序中,唯一的提示是我们遇到错误的是当程序遇到应该结束它的STOP 999
时,我们会得到一个ABEND(异常结束)通常
答案 2 :(得分:21)
我上班时遇到了麻烦。我被指控在数组声明中使用“魔术数字”。
像这样:
int Marylyn[256], Ann[1024];
公司的政策是避免这些神奇的数字,因为有人向我解释说,这些数字不是便携式的;它们阻碍了易于维护。我认为当我阅读代码时,我想确切地知道数组有多大。我失去了争论,因此,在星期五下午,我用#defines取代了令人讨厌的“魔术数字”,如下所示:
#define TWO_FIFTY_SIX 256
#define TEN_TWENTY_FOUR 1024
int Marylyn[TWO_FIFTY_SIX], Ann[TEN_TWENTY_FOUR];
在接下来的星期一下午,我被召入并被指控有被动的挑衅倾向。
答案 3 :(得分:7)
#define
可以完成普通C ++无法完成的一些工作,比如保护标头和其他任务。但是,它绝对不应该用作幻数 - 应该使用静态const。
答案 4 :(得分:7)
C没有使用consts,所以#defines是提供常量值的唯一方法。 C和C ++现在都有它们,所以使用它们毫无意义,除非它们将使用#ifdef / ifndef进行测试。
答案 5 :(得分:4)
最常见的用法(声明常量除外)是include guard。
答案 6 :(得分:1)
定义在预处理器编译之前进行评估,而变量在运行时被引用。这意味着您可以控制应用程序的构建方式(而不是它的运行方式)
以下是一些使用define的示例,它们不能被变量替换:
#define min(i,j)(((i)&lt;(j))?(i):( j))
请注意,这是由预处理器评估的,而不是在运行时
答案 7 :(得分:0)
#define
允许您在标头中建立一个值,否则将编译为大于零的大小。您的标头不应编译为大于零的大小。
// 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.