Как сделать прямое объявление структуры в Arduino?

#c #arduino

#c #arduino

Вопрос:

Представьте себе этот очень надуманный пример: (Обратите внимание, что это для C со вкусом Arduino, а не для ANSI C):

 typedef struct _node {
  int value;
  struct _node *next;
} node;
  

Используя это, я могу создать связанный список из двух узлов, построив список «назад»:

 node nodeB = { 2, (node *)0 };  // end of list
node nodeA = { 1, amp;nodeB };     // A.next => B
  

Но вместо этого, что, если я хотел бы создать список с круговой связью? Это не сработает:

 node nodeA = { 1, amp;nodeB };
node nodeB = { 2, amp;nodeA };
  

поскольку NodeB не объявляется в то время, когда NodeA хочет ссылаться на него.

Я мог бы создать связанный список во время выполнения (динамически распределять узлы, затем настраивать next ссылки). Но есть ли способ получить действительное прямое объявление во время компиляции?

Комментарии:

1. Будет ли работать обычная прямая ссылка? Попробуйте вставить «внешний узел NodeB;» спереди.

2. @SamVarshavchik: Черт возьми, да, это работает. Я не пробовал этого, потому что страница ссылки на язык ( arduino.cc/en/Reference/HomePage ) не упоминается extern как языковая конструкция. Я приглашаю вас превратить ваш комментарий в ответ … 🙂

3. На C (но не на C ) вы можете записать node nodeB; как прямое объявление

4. Почему вы требуете, чтобы список с круговой связью был настроен во время компиляции? Простое присвоение формы nodeA.next = amp;nodeB (после nodeA того, как и nodeB оба определены) — это не совсем большие затраты времени выполнения.

5. Как я уже упоминал, это надуманный пример. Мой фактический вариант использования включает в себя объединение гораздо более сложных структур, и, учитывая ограничения Arduino, я бы хотел по возможности избегать динамического распределения.

Ответ №1:

Это выглядит как довольно обычная ситуация, когда прямое объявление будет работать:

 extern node nodeB;
node nodeA = { 1, amp;nodeB };
node nodeB = { 2, amp;nodeA };
  

Комментарии:

1. Что, если им нужна внутренняя связь для обоих

2. Возможно, анонимное пространство имен, возможно: class node { public: int x; }; namespace { extern node nodeb; }; namespace { node nodeb; };