C ++ typedef интерпретация константных указателей - PullRequest
21 голосов
/ 12 февраля 2010

Во-первых, примеры кодов:

Дело 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 ]

35 голосов
/ 12 февраля 2010

Нет смысла анализировать поведение typedef на основе текстовой замены. Имена типов не являются макросами, они не заменяются текстовыми.

Как вы сами отметили

typedef CHARS const CPTR;

- это то же самое, что и

typedef const CHARS CPTR;

Это так по той же причине, по которой

typedef const int CI;

имеет то же значение, что и

typedef int const CI;

Typedef-name не определяет новые типы (только псевдонимы для существующих), но они являются «атомарными» в том смысле, что любые классификаторы (например, const) применяются на самом верхнем уровне, т.е. они применяются к весь тип, скрытый за typedef-именем. После того как вы определили typedef-name, вы не можете «вставить» в него квалификатор, чтобы он мог изменять любые более глубокие уровни типа.

13 голосов
/ 12 февраля 2010

Typedef - это не простая текстовая подстановка.

typedef const CHARS CPTR;

Означает, что «тип CPTR будет постоянным символом CHARS». Но CHARS - это тип указателя на символ, поэтому здесь говорится, что «тип CPTR будет константным указателем на тип символа». Это не соответствует тому, что вы видите, когда делаете простую замену.

Другими словами,

typedef char * CHARS;

равно не так же, как

#define CHARS char *

Синтаксис typedef подобен объявлению переменной, за исключением того, что вместо объявления целевого имени переменной, он объявляет его как имя нового типа, которое можно использовать для объявления переменных типа, который переменная была бы без ЬурейеЕ.

Вот простой процесс для определения того, что объявляет typedef:

  1. Удалите ключевое слово typedef. Теперь у вас будет объявление переменной.

    const CHARS CPTR;
    
  2. Выясните, к какому типу относится эта переменная (некоторые компиляторы имеют оператор typeof(), который делает именно это и очень полезен). Вызовите этот тип T. В этом случае постоянный указатель на (непостоянный) символ.

  3. Заменить typedef. Теперь вы объявляете новый тип (CPTR), который в точности совпадает с типом T, постоянный указатель на (не константный) символ.

...