Подтвердить что ты не робот

С++ 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 изменилось. Почему это так? Как С++ интерпретирует это определение?

4b9b3361

Ответ 1

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

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

typedef CHARS const CPTR;

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

typedef const CHARS CPTR;

Это по той же причине, почему

typedef const int CI;

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

typedef int const CI;

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

Ответ 2

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

typedef const CHARS CPTR;

означает, что тип CPTR будет состоять из const CHARS. "Но CHARS - это тип указателя на char, поэтому это говорит о том, что тип CPTR будет иметь тип const pointer-to-char." Это не соответствует тому, что вы видите, когда выполняете простую замену.

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

typedef char * CHARS;

не совпадает с

#define CHARS char *

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

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

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

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

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