C ++ 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 ++ интерпретирует это определение?

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

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

 typedef CHARS const CPTR; 

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

 typedef const CHARS CPTR; 

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

 typedef const int CI; 

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

 typedef int const CI; 

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

Typedef не является простой текстовой заменой.

 typedef const CHARS CPTR; 

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

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

 typedef char * CHARS; 

это не то же самое, что

 #define CHARS char * 

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

Вот простой способ выяснить, что объявляет typedef:

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

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

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

  • Исключение для массива, не затухающего в указатель?
  • Почему звездочка перед именем переменной, а не после типа?
  • Есть ли преимущества перехода по указателю на передачу по ссылке в C ++?
  • Как delete знает, что это массив?
  • В C, являются указателями массивов или используются в качестве указателей?
  • Существуют ли платформы, где указатели на разные типы имеют разные размеры?
  • Странное поведение с const_cast
  • С массивами, почему это так, == 5 ?
  • Что является результатом NULL + int?
  • Как использовать массивы на C ++?
  • Какова цель выделения определенного объема памяти для массивов в C ++?
  • Давайте будем гением компьютера.