C++中使用编译器常量代替预处理常量详解

对于预处理的单纯常量, 可以使用const类型进行代替;

在面向对象编程中, 类内的常量, 可以使用静态const成员代替,

注意类内(in-class), 静态const成员只允许使用整型常量进行赋值, 如果是其他类型, 是在类内声明, 类外定义的方式;

也可以使用"enum hack", 提供const的作用, 并且给内置(built-in)数组声明;

预处理的函数调用存在很多问题, 可以使用模板内联(template inline)代替, 也可以获得很高的效率;

具体参见代码, 及注释;

代码(/*eclipse cdt ; gcc 4.7.1*/):

/*
 * effectivecpp.cpp
 *
 *  Created on: 2013.11.13
 *      Author: Caroline
 */

/*eclipse cdt ; gcc 4.7.1*/

#include <iostream>
#include <string>
#include <array>  

#include <algorithm>  

using namespace std;  

#define ASPECT_RATIO 1.653 //长宽比
/*更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/*/
#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))  

class GamePlayer {
public:
    static const int NumTurns = 5;
    static const double PI ; //不能内类初始化非整型
    enum {eNumTurns = 5}; //枚举类型
    std::array<int, NumTurns> scores;
    std::array<int, eNumTurns> escores;
};
const double GamePlayer::PI = 3.14;  

template<typename T>
void f (T a) {
    std::cout << "f : " << a ;
}  

template<typename T>
inline void callWithMax(const T& a, const T& b)
{
    f(a>b ? a : b);
}  

int main (void) {  

    //预处理器定义
    std::cout << "ASPECT_RATIO = " << ASPECT_RATIO << std::endl;  

    //常量定义
    const double AspectRatio = 1.653;
    std::cout << "AspectRatio = " << AspectRatio << std::endl;  

    //常量指针
    const char* const authorName = "Caroline";
    std::cout << "authorName = " << authorName << std::endl;  

    //常量指针
    const std::string sAuthorName("Caroline");
    std::cout << "sAuthorName = " << sAuthorName << std::endl;  

    //class专属常量
    GamePlayer gp;
    std::array<int, GamePlayer::NumTurns> scores = { {1, 2, 3, 4, 5} };
    gp.scores = scores;
    std::cout << "gp.scores : ";
    for(const auto s : gp.scores)
        std::cout << s << " ";
    std::cout << std::endl;
    std::cout << "GamePlayer::PI = " << GamePlayer::PI << std::endl;  

    //测试宏
    int a = 5, b = 0;
    CALL_WITH_MAX(++a, b); //a, ++两次
    std::cout << " ; a = " << a <<std::endl;
    a = 5, b = 0;
    CALL_WITH_MAX(++a, b+10); //a, ++一次
    std::cout << " ; a = " <<  a <<std::endl;  

    //template inline
    a = 5, b = 0;
    callWithMax(++a, b);
    std::cout << " ; a = " << a <<std::endl;  

    return 0;  

}

输出:

ASPECT_RATIO = 1.653
AspectRatio = 1.653
authorName = Caroline
sAuthorName = Caroline
gp.scores : 1 2 3 4 5
GamePlayer::PI = 3.14
f : 7 ; a = 7
f : 10 ; a = 6
f : 6 ; a = 6

作者:csdn博客 Spike_King

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索include
, 静态
, const
, 类型
, 预处理
, 常量
, 代替批处理
, 代替
, 常量详解
, jquery_toggle代替
代替define
c 预处理器指令详解、用enum代替int常量、预处理、数据预处理、沼气预处理tslyhb,以便于您获取更多的相关知识。

时间: 2025-01-19 12:51:27

C++中使用编译器常量代替预处理常量详解的相关文章

php的常量和变量实例详解

php的常量和变量实例详解 [PHP在命令行下接收参数] 如果在命令行调试php,传入的参数通过$argv获取,注意其中包含了文件名这一个元素,数组中元素的个数通过$argc获取. [可变变量] 指的是变量的名称可变,变量的标识符可以由另一个变量的值来代替. 例如:第二个语句是为argv1这个变量赋值. <?php $varName = 'argv1'; $$varName = 'value1'; var_dump($argv1); ?> [常量] 使用define定义,不可删除和修改,调用时

Python中使用不同编码读写txt文件详解

  这篇文章主要介绍了Python中使用不同编码读写txt文件详解,本文给出不同编码下的读写文件代码方法,需要的朋友可以参考下 代码如下: import os import codecs filenames=os.listdir(os.getcwd()) out=file("name.txt","w") for filename in filenames: out.write(filename.decode("gb2312").encode(&q

C#中string.Empty和null的区别详解

  这篇文章主要介绍了C#中string.Empty和null的区别详解,本文同时讲解了空字符串和Empty的区别以及string.Empty与null的区别,需要的朋友可以参考下 这是一个及其常见的问题,网上已经有关于这个问题的很多讨论.但是我觉得都是不求甚解,有一些还是在误导别人.下面我来说下我对这三者的理解,如有错误的地方请大家及时指正. 一:""与string.Empty我认为是一样的.网上有一篇被转载了几十遍的文章是这样说的string.Empty 不分配存储空间,"

MySQL 中修改密码及访问限制设置详解

mysql|访问|详解 MySQL中修改密码及访问限制设置详解 MySQL是一个真正的多用户.多线程SQL数据库服务器.MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序和库组成.由于其源码的开放性及稳定性,且与网站流行编?挥镅?PHP的完美结合,现在很多站点都利用其当作后端数据库,使其获得了广泛应用.处于安全方面的考虑,需要为每一用户赋于对不同数据库的访问限制,以满足不同用户的要求.下面就分别讨论,供大家参考. 一.MySQL修改密码方法总结 首

Python中Continue语句的用法的举例详解

  这篇文章主要介绍了Python中Continue语句的用法的举例详解,是Python入门中的基础知识,需要的朋友可以参考下 Python continue语句返回while循环的开始.Continue语句拒绝在该循环的当前迭代中的其余语句执行并移动控制返回到循环的顶部(开始位置). continue语句可以在while和for循环使用. 语法 Python continue语句的语法如下: continue 流程图: 例子 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14

JQuery中$.each 和$(selector).each()的区别详解

 这篇文章主要介绍了JQuery中$.each 和$(selector).each()的区别详解,本文给出了多个例子讲解了它们之间的不同之处,需要的朋友可以参考下     一个通用的遍历函数 , 可以用来遍历对象和数组. 数组和含有一个length属性的伪数组对象 (伪数组对象如function的arguments对象)以数字索引进行遍历,从0到length-1, 其它的对象通过的属性进行遍历. $.each()与$(selector).each()不同, 后者专用于jquery对象的遍历, 前

SQLserver中cube:多维数据集实例详解

1.cube:生成多维数据集,包含各维度可能组合的交叉表格,使用with 关键字连接 with cube 根据需要使用union all 拼接 判断 某一列的null值来自源数据还是 cube 使用GROUPING关键字 GROUPING([档案号]) = 1 : null值来自cube(代表所有的档案号) GROUPING([档案号]) = 0 : null值来自源数据 举例: SELECT * INTO ##GET FROM (SELECT * FROM ( SELECT CASE WHEN

CSS中伪类及伪元素用法详解

原文:CSS中伪类及伪元素用法详解 伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的读者可以自己尝试:   :active  大致效果为用鼠标点击时,元素增加特效,鼠标松开时,特效消失.多用在按钮的点击上.  写法: 这里id为box的是一div块,在css中首先设置了他的基本样式,下面为加入:active伪类后需要修改的样式. 未点击时: 点击之后: :active.:hove

ui-UI 中的tag怎么用 新手求详解,最好是实例+解释 新手初试

问题描述 UI 中的tag怎么用 新手求详解,最好是实例+解释 新手初试 UI 中的tag怎么用 新手求详解,最好是实例+解释 ;;;;;;;;;;;;;;;;;;;;;;;;;;; 解决方案 tag可以附加任何你觉得需要附加的数据.比如说id.额外的字段等等.

js基础之DOM中document对象的常用属性方法详解_javascript技巧

-----引入 每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问. 属性 1  document.anchors  返回对文档中所有 Anchor 对象的引用.还有document.links/document.forms/document.images等 2  document.URL       返回当前文档的url 3  document.title       返回当前文档的标题 4  do