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