【问题标题】:C++ typedef interpretation of const pointersconst 指针的 C++ typedef 解释
【发布时间】:2011-01-16 06:14:32
【问题描述】:

首先,示例代码:

案例一:


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++ 如何解释这个定义?

【问题讨论】:

  • 一般来说,typedef 指针(隐藏星号)是个坏主意,正是因为 const 不能再插入到指向的类型和星号之间了。

标签: c++ pointers constants typedef


【解决方案1】:

在文本替换的基础上分析typedef 的行为是没有意义的。 Typedef 名称不是宏,它们不会被文本替换。

正如你自己所说的

typedef CHARS const CPTR;

是一样的
typedef const CHARS CPTR;

出于同样的原因

typedef const int CI;

含义相同
typedef int const CI;

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

【讨论】:

    【解决方案2】:

    Typedef 不是简单的文本替换。

    typedef const CHARS CPTR;
    

    表示“CPTR 类型将是一个 const CHARS 事物。”但是 CHARS 是指向字符的指针类型,所以这表示“CPTR 类型将是 const 指向字符的指针类型”。这与您执行简单替换时看到的不匹配。

    换句话说,

    typedef char * CHARS;
    

    一样
    #define CHARS char *
    

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

    这里有一个简单的过程来弄清楚 typedef 声明了什么:

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

      const CHARS CPTR;
      
    2. 弄清楚该变量是什么类型(一些编译器有一个 typeof()operator 可以做到这一点并且非常有用)。调用该类型 T。在这种情况下,一个指向(非常量)char 的常量指针。

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

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多