C ++ typedef解释const指针

时间:2010-02-12 17:27:21

标签: c++ pointers const typedef

首先,示例代码:

案例1:


typedef char* CHARS;
typedef CHARS const CPTR;   // constant pointer to chars

以文本方式替换CHARS:


typedef char* const CPTR;   // still a constant pointer to chars

案例2:


typedef char* CHARS;
typedef const CHARS CPTR;   // constant pointer to chars

以文本方式替换CHARS:


typedef const char* CPTR;   // pointer to constant chars

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

2 个答案:

答案 0 :(得分:34)

在文本替换的基础上分析typedef行为毫无意义。 Typedef-name不是宏,不会以文本方式替换它们。

正如你自己注意到的那样

typedef CHARS const CPTR;

相同
typedef const CHARS CPTR;

出于同样的原因

typedef const int CI;

具有相同的含义
typedef int const CI;

Typedef-name没有定义新类型(只有现有的别名),但它们在某种意义上是“原子的”,任何限定符(如const)都适用于最高级别,即它们适用到typedef-name后面隐藏的整个类型。一旦定义了typedef-name,就不能在其中“注入”限定符,以便它可以修改该类型的任何更深层次。

答案 1 :(得分:13)

Typedef不是一个简单的文本替换。

typedef const CHARS CPTR;

表示“CPTR类型将是const CHARS事物。”但是CHARS是一个指向char类型的指针,因此这表示“CPTR类型将是一个const指针指向char类型”。这与您在进行简单替换时所看到的不符。

换句话说,

typedef char * CHARS;

相同
#define CHARS char *

typedef语法类似于变量声明,不同之处在于它不是将目标名称声明为变量,而是将其声明为新的类型名称,可用于声明变量的类型变量而不是的typedef。

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

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

    const CHARS CPTR;
    
  2. 找出该变量的类型(某些编译器有一个typeof()运算符,它完全正确,并且非常有用)。调用类型T.在这种情况下,指向(非常量)char的常量指针。

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