这是一个简单的问题,但为什么有人会使用#define定义常量?
有什么区别
#define sum 1 和 const int sum = 1;
有没有办法让这个功能更优雅?我是C++的新手,我不知道是否有更标准化的方法来做到这一点.这可以变成一个循环,所以变量的数量不受我的代码限制吗?
float smallest(int x, int y, int z) {
int smallest = 99999;
if (x < smallest)
smallest=x;
if (y < smallest)
smallest=y;
if(z < smallest)
smallest=z;
return smallest;
}
Run Code Online (Sandbox Code Playgroud) 我觉得,每次我读C或C++程序时,其中一半或更多只是宏.我知道宏可以很酷但是它们很难跟踪,调试等.更不用说大多数编程语言甚至都没有定义像宏这样的东西(尽管Perl6会有类似的东西).
我个人总是找到一种方法来编写我的代码而不使用宏,无论是模板,多重继承等.我甚至觉得我不是一个优秀的程序员,因为所有的专业人员使用宏,我尽量避免使用它们如我所能.
问题是,如果没有宏,是否存在无法解决的问题?宏最终是一个好/坏的做法?我什么时候应该考虑使用宏?
使用#define而不是const有什么优缺点(反之亦然)?
当我读到错误的编程实践特别是魔术数字时,我发现自己更频繁地使用#define.一些问题突然出现在我脑海中,例如:
使用#define很难吗?
它需要内存空间吗?
使用const会更快吗?
我读了一下这个,但我仍然不确定,从我所理解的:
#define定义一个宏(不确定宏意味着什么),它处理预处理.在处理代码之前,它会将已定义关键字的所有实例替换为其他实例.另一方面,const是变量,其值在运行时期间不能在中途改变.
我能想到使用const的唯一原因是该值是否依赖于其他变量.例如:
#define PI 3.14159f
#define RADIUS 3.0f
#define AREAOFCIRCLE PI*RADIUS*RADIUS
Run Code Online (Sandbox Code Playgroud)
由于AREAOFCIRCLE的每个实例都将被PI*RADIUS*RADIUS取代,因此每次使用AREAOFCIRCLE时程序都会为它计算,因此效率很低.另一方面:
const float areaofcircle = PI*RADIUS*RADIUS;
Run Code Online (Sandbox Code Playgroud)
会更有效,因为程序只计算一次.
回到最初的问题,#define与const相比如何?
我需要一个常量的字符串数组.使用#define是个好主意?
例如:
#define rows [NSArray arrayWithObjects: @"NameRowA",@"NameRowB",@"NameRowC", nil]
#define KEY_ROWA [columnas objectAtIndex:0]
#define KEY_ROWB [columnas objectAtIndex:1]
#define KEY_ROWC [columnas objectAtIndex:2]
Run Code Online (Sandbox Code Playgroud)
我需要访问字符串数组和该数组的元素.
我已经读过了,(我不知道是不是真的)用这种方式创建一个新的NSArray,当它被使用时,我想这个数组已经发布了,所以我认为这很好,因为你只使用那部分内存什么时候需要它.
有人告诉我#define很糟糕.好吧,老实说我不明白为什么不好.如果它不好,那么我可以用其他方式做到这一点呢?
#include <iostream>
#define stop() cin.ignore(numeric_limits<streamsize>::max(), '\n');
Run Code Online (Sandbox Code Playgroud) 我经常在我的代码中使用const查找表,它由id和字符串组成.但为了便于阅读,最好使用符号名称(命名常量)而不是id.例:
class LookupTable
{
map<int,string> m { {10,"red"}, {20,"blue"}, {30,"green"} };
enum { col_rd = 10, col_bl = 20, col_gr = 30 };
};
LookupTable tab;
cout << tab.m[10]; // "red", using the id
cout << tab.m[col_bl] // "blue", using a symbol
cout << tab.m[11]; // Typo! Compiler does not check this
cout << tab.m[col_xy]; // Typo! Compiler will complain
Run Code Online (Sandbox Code Playgroud)
在编译时也将检查使用符号名称的拼写错误.
但我喜欢在一个地方定义元素的符号名称,id和字符串,而不是在上部定义值,然后在类声明的下半部分定义命名常量,特别是如果表是相当长.例如,我想写一些像:
mytable.init = { { col_rd, 10, "red" }, // define the symbol names and
{ col_bl, …Run Code Online (Sandbox Code Playgroud)