C++ typedef解释const指针

jas*_*ine 21 c++ pointers typedef const

首先,示例代码:

情况1:


typedef char* CHARS;
typedef CHARS const CPTR;   // constant pointer to chars
Run Code Online (Sandbox Code Playgroud)

文本替换CHARS变为:


typedef char* const CPTR;   // still a constant pointer to chars
Run Code Online (Sandbox Code Playgroud)

案例2:


typedef char* CHARS;
typedef const CHARS CPTR;   // constant pointer to chars
Run Code Online (Sandbox Code Playgroud)

文本替换CHARS变为:


typedef const char* CPTR;   // pointer to constant chars
Run Code Online (Sandbox Code Playgroud)

在案例2中,在文本替换CHARS之后,typedef的含义发生了变化.为什么会这样?C++如何解释这个定义?

AnT*_*AnT 36

typedef文本替换的基础上分析行为是没有意义的.Typedef-name不是宏,它们不是以文本方式替换的.

正如你所说的那样

typedef CHARS const CPTR;
Run Code Online (Sandbox Code Playgroud)

是一样的

typedef const CHARS CPTR;
Run Code Online (Sandbox Code Playgroud)

这是出于同样的原因

typedef const int CI;
Run Code Online (Sandbox Code Playgroud)

具有相同的含义

typedef int const CI;
Run Code Online (Sandbox Code Playgroud)

typedef的名称没有定义的新类型(仅别名,现有的),但他们在某种意义上是"原子",任何限定词(如const)在最高层级应用,即它们应用到整个类型隐藏在背后的typedef -名称.一旦定义了typedef-name,就不能在其中"注入"限定符,以便它可以修改该类型的任何更深层次.


Tim*_*fer 13

Typedef不是简单的文本替换.

typedef const CHARS CPTR;
Run Code Online (Sandbox Code Playgroud)

意味着"CPTR类型将是一个常见的CHARS事物." 但是CHARS是一个指向char类型的指针,因此这表示"CPTR类型将是一个const指针指向char类型".这与您在进行简单替换时所看到的不符.

换一种说法,

typedef char * CHARS;
Run Code Online (Sandbox Code Playgroud)

一样的

#define CHARS char *
Run Code Online (Sandbox Code Playgroud)

typedef的语法就像是一个变量声明,除了不是宣告目标名称是一个变量,它宣称它可用于声明变量是没有类型定义的类型变量的新类型的名称.

这是一个简单的过程,用于确定typedef声明的内容:

  1. 删除typedef关键字.现在你将有一个变量声明.

    const CHARS CPTR;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 弄清楚该变量的类型(某些编译器具有typeof()完全正确执行此操作且非常有用的运算符).调用类型T.在这种情况下,指向(非常量)char的常量指针.

  3. 替换typedef.您现在声明一个新类型(CPTR),它与T完全相同,是一个指向(非常量)char的常量指针.