#define
在 C++ 中的作用是什么?我只看到它被用来代替“魔法数字”,但我不明白为什么不直接将该值赋给变量。
#define
在 C++ 中的作用是什么?我只看到它被用来代替“魔法数字”,但我不明白为什么不直接将该值赋给变量。
#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
一些资源:
现在大多数情况下是为了风格而使用const。当C语言年轻的时候,没有const变量这个概念。因此,如果你使用一个变量而不是#define
,你无法保证某个地方的某个人不会更改它的值,从而在整个程序中造成混乱。
在旧时代,FORTRAN甚至将常量作为引用传递给子程序,这可能会导致将像“2”这样的常量的值更改为其他值(这会让人头疼)。有一次,在我正在工作的程序中发生了这种情况,我们唯一的提示是当程序达到本应正常结束的STOP 999
时,我们会收到一个ABEND(异常结束)。
有一次我在工作中遇到了麻烦。有人指责我在数组声明中使用了“魔法数字”。
就像这样:
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];
接下来的星期一下午,我被叫去并被指控具有被动抵抗倾向。
#define MARYLYN_SIZE 256
就是你想要的。 - Mo Beigistatic constexpr const size_t MAX_HOMES_AVAILABLE = 1024; int Ann[MAX_HOMES_AVAILABLE];
。如果选择非常明显且本地化,那么直接使用1024并不会太糟糕,但像Harpee所做的那样就是在刁难人了。 - Lightness Races in Orbit#define
可以完成一些普通的C++无法完成的任务,比如保护头文件和其他任务。然而,它绝对不应该被用作魔数-应该使用静态常量代替。
C语言以前没有常量,因此#define是提供常量值的唯一方法。现在C和C++都有常量,因此除非它们将使用#ifdef/ifndef进行测试,否则没有使用它们的必要。
预处理器在编译之前评估define,而变量是在运行时引用的。这意味着您可以控制应用程序的构建方式(而不是运行方式)
以下是一些使用define的示例,它们无法被变量替换:
#define min(i, j) (((i) < (j)) ? (i) : (j))
请注意,这是由预处理器在编译期间评估的,而不是在运行时。
#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。
const double TAX_RATE = 0.625
。默认情况下,常量具有翻译单元作用域。 - user2100815
#define
定义常量。事实上,这被认为是违反C++规范的做法或者类似于这样的做法。 - supercheetah#define fori(x) for (int i=0; i<=x; i++)
应该改为#define fori(x) for (int i=0; i<=(x); i++)
。 (请注意额外的括号。)在这个例子中,括号的使用可能不明显,但是如果有人在参数 x 中放置位运算,将会发生错误。 - lwchkg