C / C++ Typedef для struct * и const

У меня есть следующий код

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 оценивает то, чего я не ожидаю?

C / C++ Typedef для struct * и const

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

Richard Chambers 09.01.2019 03:15

@RichardChambers К сожалению, мне нужно сделать typdef struct A *B для полностью защитить членов моей структуры. В этой ссылке вы можете увидеть стратегию, которую я использую, чтобы сделать невозможным разыменование членов B. Это обеспечит инкапсуляцию.

Hatefiend 09.01.2019 03:33

typedef оценивает именно то, что ожидается. Вы ожидаете, что сможете вставить константу после создания typedef. Возможно, вам понадобится еще один typedef для описания версии const.

dgsomerton 09.01.2019 03:50

@Hatefiend typedef - это синтаксический сахар, способ пометить определенный тип. В приведенной вами ссылке typedef делается для того, чтобы сделать его менее громоздким и набирать меньше символов для человека, использующего библиотеку. Пример forward объявляет структуру, затем выполняет typedef, используя объявленную структуру forward, чтобы определить тип указателя на структуру. Однако во всех местах, где используется SomeThing, это также может быть struct SomeStruct *.

Richard Chambers 09.01.2019 08:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
43
0

Другие вопросы по теме