У меня есть следующий код
struct A { }
typedef struct A *B;
На этом этапе я хочу объявить функцию, которая принимает const B. Другими словами, я хочу создать функцию
void funct(const struct A *val);
Однако когда я это сделаю
const B b1 = ...;
мой компилятор утверждает, что он оценивается как
struct A *const b1 = ...;
Я хочу объявить переменную типа данных B, чтобы она оценивалась как
const struct A *b1;
// or
const struct A *const b1;
Как это может быть сделано? Почему typedef оценивает то, чего я не ожидаю?
@RichardChambers К сожалению, мне нужно сделать typdef struct A *B для полностью защитить членов моей структуры. В этой ссылке вы можете увидеть стратегию, которую я использую, чтобы сделать невозможным разыменование членов B. Это обеспечит инкапсуляцию.
typedef оценивает именно то, что ожидается. Вы ожидаете, что сможете вставить константу после создания typedef. Возможно, вам понадобится еще один typedef для описания версии const.
@Hatefiend typedef - это синтаксический сахар, способ пометить определенный тип. В приведенной вами ссылке typedef делается для того, чтобы сделать его менее громоздким и набирать меньше символов для человека, использующего библиотеку. Пример forward объявляет структуру, затем выполняет typedef, используя объявленную структуру forward, чтобы определить тип указателя на структуру. Однако во всех местах, где используется SomeThing, это также может быть struct SomeStruct *.





Я предлагаю вам просто использовать
typedefдля определения типа чего-то вродеtypedef struct A objectA;, а затем в своем коде вы можете использоватьconst objectA *pObject;илиobjectA * const pObject;. Вы также можете использоватьtypedefдля определения постоянного варианта типа указателя, если хотите пойти по этому пути. В общем, гораздо лучше не скрывать определение указателя вtypedef, хотя я должен признать, что сам делал это один или два раза для специальной реализации непрозрачной области данных, которую я хотел использовать в качестве массива. Это были особые обстоятельства.