Вопрос по c, typedef, struct, namespaces – C Typedef и структура вопроса

10

В чем разница между этими двумя декларациями, и является ли одно предпочтительным по сравнению с другим?

typedef struct IOPORT {  
    GPIO_TypeDef* port;  
    u16           pin;  
} IOPORT;  

typedef struct {  
    GPIO_TypeDef* port;  
    u16           pin;  
} IOPORT;  

Ваш Ответ

4   ответа
7

Что касается того, какой стиль предпочтительнее, я предпочитаю первый стиль (с именем в теге struct и в качестве typedef для структуры) просто потому, что в исходном файле нет недостатков, кроме нескольких символов. Мой фрагмент структуры IDE отбрасывает имя в обоих местах, поэтому я всегда получаю имя структуры typedef вместе с именем тега struct.

Вы получаете несколько небольших преимуществ:

the "struct STRUCTNAME" can be used to declare pointers to the struct within the struct you can get away with just using STRUCTNAME in either C or C++ code you prevent a potential (even if very rare in practice) oddity in C++ having to do with the struct name being used for another object without error or warning

Но если мне придется вручную вводить определение структуры, я часто буду лениво пренебрегать объявлением одного или другого имени.

0

лежащих связанных списков и деревьев (какВиктор указывает на). Второй пример анонимных типов, который, как показывает опыт, не очень хорошо работает со всеми компиляторами. Поэтому первый подход, вероятно, рекомендуется. Если вы не заинтересованы в том, чтобы структура могла ссылаться на себя, вы всегда можете дать ей имя, которое вряд ли будет конфликтовать, например, __SOMEPREFIX_IOPORT__.

Идентификаторы, которые начинаются с двойного подчеркивания или подчеркивания + заглавная буква, зарезервированы, поэтому их не следует использовать. Они могут конфликтовать с идентификатором в компиляторе или стандартных библиотеках. Увидетьstackoverflow.com/a/1449301
8

где пространство имен тега структуры является одним из них. Следовательно:

struct foo { int bar; };

не определяет новый тип в общем смысле. Если у вас есть только структурный тег, вам необходимо добавить ключевое слово «struct» apos; в объявлениях объектов вот так:

foo b; /* error */
struct foo b; /* correct */

Кроме того, вы можете сразу создать новый объект в определении следующим образом:

struct foo { int bar; } baz;

Где baz - это объект структуры типа foo. Тем не менее, часто требуется определить структуру как новый тип, чтобы сохранить некоторые записи. Полный тип не ссылается на теги структуры, поэтому вы можете опустить «struct» apos; префикс во время объявлений.

typedef struct foo { int bar; } baz;

Тем не менее, вы можете объявлять объекты с помощью «struct foo», поскольку foo является тегом struct. Но теперь он превращается в полный тип в «нормальном» режиме. тип namespace, где он известен как тип baz. Таким образом, с typedef, «baz» Поле (поля) имеет различную семантику.

Если вам не нужно объявлять указатели на тип структуры внутри себя (связанные списки, древовидные структуры), пропустите его. Добавление того, которое не требуется, просто загрязняет пространство имен.

15

ъекты того же типа. полезно в таких случаях, как связанные списки, где узел должен ссылаться на узел.

Похожие вопросы