「effectiveC++」02_使用const 代替 #define 定义常量

#define不被视为语言的一部分。那正是它的问题所在。当你做出这样的事情:

#define ASPECT_RATIO 1.653

记号名称ASPECT_RATIO也许从未被编译器看见;

也许在编译器开始处理源码之前它就被预处理器移走了。

于是记号名称 ASPECT_RATIO 有可能没进入记号表(symbol table)内。

于是当你运用此常量但获得一个编译错误信息时,可能会带来困惑,因为这个错误信息也许会提到 1.653 而不是 ASPECT_RATIO。

如果 ASPECT_RATIO 被定义在一个非你所写的头文件内,你肯定对1.653以及它来自何处毫无概念,于是你将因为追踪它而浪费时间。

这个问题也可能出现在记号式调试器(symbolic debugger)中,原因相同:你所使用的名称可能并未进入记号表(symbol table)。

解决之道是以一个常量替换上述的宏(#define):

const double aspectRatio = 1.653;  // 大写名称通常用于宏,因此这里改变变量名称写法

当我们以常量替换 #define,有两种特殊情况值得说说。

第一是定义常量指针(constant pointers)。

由于常量定义式通常被放在头文件内(以便被不同的源码含入),因此有必要将指针(而不只是指针所指之物)声明为const。

例如若要在头文件内定义一个常量的(不变的)char *based字符串,你必须写const两次:

const char * const authorName = "yang";

第二个值得注意的是class专属常量。

为了将常量的作用域(scope)限制于class内,你必须让它成为class的一个成员(member);

而为确保此常量至多只有一份实体,你必须让它成为一个static成员:

class GamePlayer {
private:
    static const int numTurns = 5;
};

公众号: cpp_yang

个人微信: yangxg_cxy

今日头条: 程序员杨小哥

B站: https://space.bilibili.com/473029051

知乎: https://www.zhihu.com/people/cpp_yang

展开阅读全文

页面更新:2024-05-01

标签:常量   小哥   定义   可能会   编译器   写法   记号   所指   字符串   指针   变量   程序员   源码   成员   名称   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top