C ++ typedef интерпретация константных указателей
Во-первых, примеры кодов:
Дело 1:
typedef char* CHARS; typedef CHARS const CPTR; // constant pointer to chars
Текст, заменяющий CHARS, становится:
- Нарезка указателя среза, переданного в качестве аргумента
- Динамическое распределение массива объектов
- Все ли указатели данных одинакового размера на одной платформе для всех типов данных?
- Вызывать функцию golang struct дает «не может ссылаться на невыполненное поле или метод»
- Когда это действительно для доступа к указателю на «мертвый» объект?
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 ++ интерпретирует это определение?
- Арифметика указателей в C
- Как изменить указатель, который был передан в функцию в C?
- Могу ли я использовать if (указатель) вместо if (pointer! = NULL)?
- Направлять указатель на функцию-член в обычный указатель
- Почему указатели на функции и указатели данных несовместимы в C / C ++?
- Есть ли у Java указатели?
- C указатели и массивы / оператор 'sizeof'
- Как увеличить адрес указателя и значение указателя?
Нет смысла анализировать поведение 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:
-
Удалите ключевое слово
typedef
. Теперь у вас будет объявление переменной.const CHARS CPTR;
-
Выясните, какой тип этой переменной (некоторые компиляторы имеют оператор
typeof()
который делает именно это и очень полезен). Вызовите этот тип T. В этом случае указатель константы на (непостоянный) char. -
Замените
typedef
. Теперь вы объявляете новый тип (CPTR
), который является точно таким же типом, что и T, постоянным указателем на (непостоянный) символ.