【C++】typedef与const的纠纷

const和 define在常量定义上的问题

在C++中,我们都鼓励使用const定义常量,而不是宏define。原因有很多。

一。const比define更优雅,更符合符号常量的本意。

二。define用在复杂的代码中,不理解define的实质的人就会出问题。define是代码字面上的替换,预处理阶段还原替换的内容。而typedef是包装已经存在的类型(或者复合类型),定义新的原子类型。

#include<iostream>
#define DAYS 365
const int MONEY = 100;  

int main(void)
{
    using namespace std;

    int total = DAYS*MONEY;

    cout<<total<<endl;

    system("pause");

    return 0;
}

预处理后

#include<iostream>

const int MONEY = 100;
int main(void)
{
    using namespace std;

    int total = 365*MONEY;  //预处理器将DAYS替换为356

    cout<<total<<endl;

    system("pause");

    return 0;
}

const定义的常量可以说是“不变的变量“,因为它确实用了一个变量取保存某个不会发生改变的值,而define定义的常量,实质上是字面值常量,当然也不会改变了。

const到底修饰谁,到底哪个才是不变的?

我总结的是:如果const放在最前面,则const会往后跨越一个原子类型,修饰后面的。如何理解这句话,通过代码演示:

#include<iostream>

int main(void)
{
    using namespace std;

    int a = 1;

    const int*p = &a;     //int为原子类型,实质效果是: int const*p = &a;
                          //即:通过指针p来操作a时,a是一个常量,只读不可写。

    system("pause");

    return 0;
}
#include<iostream>

typedef int* pint;
int main(void)
{
    using namespace std;

    int a = 1;

    const pint p = &a;     //pint为原子类型,实质效果是: pint const p = &a;
                           //即:p是一个常量,只读不可写。

    //p = NULL     error

    //*p = 100     ok

    system("pause");

    return 0;
}
时间: 2024-08-04 14:18:16

【C++】typedef与const的纠纷的相关文章

typedef 和 const

1. typedef 允许你为各种数据类型定义新名字 #include <stdio.h>typedef char *ptr_to_char; //这让我看起来,好奇怪,不好读void main(){ char a = 'c'; //char *b = &a; ptr_to_char b; b = &a; printf("%c\n", *b);} 2. 常量的值无法修改 int const a; const int a; 两者都可以,但是一般采取第一种,可读

C++ typedef与const

1.typedef 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间:  typedef     int        INT; struct tagNode { char *pItem; struct tagNode* pNext; }; typedef struct tagNode* pNode; 2.const const常量存在于程序的数据段,是一个常数值.

[C++] typedef和const

如果某个类型别名指代的是符合类型,那么把它用到声明语句中可能会让人误解.比如如下的类型pstring,实际上是char*的别名: typedef char *pstring; const pstring cstr = 0; // cstr是一个指向char的常量指针 const pstring *ps; // ps是一个指针,它的对象是指向char的常量指针 上述两条声明语句的基本数据类型都是const pstring,const是对给定类型的修饰.pstring实际上是指向char的指针,因此

[Syntax] typedef & const

略: typedef 和 #define 的比较 #define 是编译预处理时执行,会进行简单替换 typedef 是在编译时期处理,晚于#define 情形1 const char *p1; char const *p2; p1 = p2 = "指针可变,指向内容不可变"; char * const p3 = "指针不可变,指向内容可变"; /** * Error Code Below * p1[0] = 'x'; * p3 = "xxx";

typedef 自定义 const define

typedef list<CNewParRange> ParList; const CString C_Pos_Start_Completion[] = { _T("M2208"), _T("M2240"), _T("M2272"), _T("M2304"), _T("M2336"), _T("M2368"), _T("M2400"), _T("

const和typedef的常见用法详解

一.说说const 一般而言,const主要是用来防止定义的对象再次被修改,定义对象变量时要初始化变量. 常见用法如下: 1.用于定义常量变量,这样这个变量在后面就不可以再被修改 const int Val = 10; //Val = 20; //错误,不可被修改 2. 保护传参时参数不被修改,如果使用引用传递参数或按地址传递参数给一个函数,在这个函数里这个参数的值若被修改, 则函数外部传进来的变量的值也发生改变,若想保护传进来的变量不被修改,可以使用const保护 void  fun1(con

[转]不能将参数1从“const char []”转换为“LPCTSTR

今天在使用vs2008+MFC时候,使用editControl的replacesel(“”)发生报错.如下::不能将参数1从“const char []”转换为“LPCTSTR” 其解决方案就是, 在项目属性里面找到项目默认值下面的字符集, 将其换为:使用多字节字符集就ok了.原因: typedef   LPCTSTR    LPTSTR ; #ifndef   _UNICODE    typedef   TCHAR   char;    #else    typedef   TCHAR   w

基于typedef的用法详解【转】

也许新手用这个关键字不多,但它却是一个很有用的关键字,可以使代码模块化程度更好(即与其它代码的关联较少),在C++中还是实现Traits技术的基础,也是模板编程的基本语法之一. 若说变量定义是为变量命名,而typedef(或称为类型定义)就是为类型命名.既然都是命名,那就会有很多类似的地方.而变量定义我想大家都会使用,因此类型定义也必然会使用. 类型定义的语法可以归结为一句话:只要在变量定义前面加上typedef,就成了类型定义.这儿的原本应该是变量的东西,就成为了类型.如,下面的变量定义:in

C 中typedef 函数指针的使用

类型定义的语法可以归结为一句话:只要在变量定义前面加上typedef,就成了类型定义.这儿的原本应该是变量的东西,就成为了类型. int integer;     //整型变量int *pointer;   //整型指针变量int array [5]; //整型数组变量int *p_array [5]; //整型指针的数组的变量int (*array_pointer) [5];//整型数组的指针的变量int function (int param);//函数定义,也可将函数名看作函数的变量int