2010-02-12 76 views
19

首先,样本的代码:C++常量指针的typedef解释

情况1:


typedef char* CHARS; 
typedef CHARS const CPTR; // constant pointer to 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++如何解释这个定义?

+8

一般来说,typedef指针(隐藏星号)是一个坏主意,正因为const不能插入指向类型和星号之间。 – Tronic 2010-02-12 17:44:04

+0

http://stackoverflow.com/questions/1808471/is-const-lpvoid-equivalent-to-void-const/1808665的重复排序 – 2010-02-12 18:57:49

回答

33

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

正如你指出自己

typedef CHARS const CPTR; 

是一回事

typedef const CHARS CPTR; 

这是因此对于同样的原因,

typedef const int CI; 

的含义

相同
typedef int const CI; 

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

12

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

typedef const CHARS CPTR; 

表示“CPTR类型将是一个常量CHARS的东西。”但是CHARS是一个指向字符类型的指针,所以这说“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的常量指针的类型完全相同。