画册设计公司网站,学校网站建设招聘,网站建设程序都有哪些,咖啡网站设计建设一.const替换#define #define的两个缺点#xff1a; 不便于调试#xff0c;编译器看到的是宏替换后的值#xff0c;报错时显示也是替换后的内容#xff0c;不便于定位错误目标代码中出现多个替换后的内容。因为宏替换在预处理阶段完成#xff0c;宏是不会进入记号表的。 …一.const替换#define #define的两个缺点 不便于调试编译器看到的是宏替换后的值报错时显示也是替换后的内容不便于定位错误目标代码中出现多个替换后的内容。因为宏替换在预处理阶段完成宏是不会进入记号表的。 替换方案使用const
//#define ARPECT_RATIO 1.653;
const double ArpectRatio 1.653;用#define替换常量时的两种特殊情况
1.定义常量指针
//#define NAME Effective C
const char* const Name Effective C;
2.定义特定于类的常量
将常量作用域限制在类中并确保只有一个常量的副本就必须设置为类的静态成员
class GamePlayer
{//#define NUMTURNS 5;//这是无效的#define只是无脑替换无法将将作用域限制在类的内部static const int NumTurns 5;//静态成员变量声明int scores[NumTurns];//使用静态成员变量
}; 通常情况下C要求为所使用的任何东西提供定义但类的静态整数类型常量如boolintchar是个特例可以声明时就给初值在不取它们地址地址的情况下可以直接使用不用提供定义。 如果你在声明时给了初值定义时就不能给值了。如果声明时没有给初值定义时就能给值了。 class GamePlayer
{//#define NUMTURNS 5;//这是无效的#define只是无脑替换无法将将作用域限制在类的内部static const int NumTurns 5;//静态成员变量声明//使用静态成员变量
};//const int GamePlayer::NumTurns 6;//不允许的
const int GamePlayer::NumTurns;
二.enum替代#define
枚举类型的值可以在需要int的地方使用
class GamePlayer
{enum{NumTurns 5};int scores[NumTurns];//使用枚举常量枚举更像#define不能取地址
};三.inline替代#define
我们实现如下宏函数
#define CALL_WITH_MAX(a, b) f((a) (b) ? (a) : (b)) //f是一个函数 尽管我们已经很小心了为每个参数都加上了括号但问题防不胜防
int a 5, b 0;
CALL_WITH_MAX(a, b);
CALL_WITH_MAX(a, b 10);
由于#define只是无脑替换根据执行逻辑第一个表达式a会被两次第二个a会一次。这绝不是我们想要的结果我们期望a无论如何只会一次
替代方案模版内联函数既能获得宏的效率又能保证函数行为可预测与类型安全
templateclass T
inline void CallWithMax(const T a, const T b)
{f(a b ? a : b);
}