为什么使用 #define 而不是变量
Why use #define instead of a variable
C++#define
有什么意义?我只见过使用它代替"幻数"的例子,但我不认为只是将该值赋予变量有什么意义。
#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
一些资源:
- 维基百科文章
- C++特定站点
- 有关 GCC 预处理器的文档
- Microsoft参考 资料
- C 特定站点(我认为它与C++版本没有什么不同)
这些天主要是风格。 当 C 年轻时,没有常量变量这样的东西。 因此,如果您使用变量而不是#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
可以完成一些正常C++无法完成的工作,例如保护标头和其他任务。但是,它绝对不应该用作幻数 - 应该使用静态常量。
C 没有常量,所以 #defines 是提供常量值的唯一方法。C 和 C++ 现在都有它们,所以使用它们没有意义,除非它们要用 #ifdef/ifndef 进行测试。
最常见的用法(声明常量除外)是包含保护。
预处理器编译之前进行评估,而变量在运行时引用。这意味着您可以控制应用程序的构建方式(而不是其运行方式)
以下是几个使用 define 的示例,这些示例不能被变量替换:
#define min(i, j) ((i) <(j)) ?(一) : (j))
注意 这是由预处理器评估的,而不是在运行时评估的http://msdn.microsoft.com/en-us/library/8fskxacy.aspx
#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。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 如何避免#define语法的变量重新声明
- 如何全局 #define 预处理器变量?
- #define 具有变量名称的函数
- 是否有一种方法可以将变量列表传递给#Define指令,并导致其通过文字值替换字符串值
- #define变量在windows.h中被忽略并重新定义
- C++ #define 和常量变量相乘时出错
- 是否可以使用方法返回使用 #define 创建的变量
- 具有 #define 的新变量
- 为#define使用变量
- 在#define中打印变量名
- c预处理器-用c++#define替换对变量的所有引用
- 为什么使用 #define 而不是变量