использование typedef в объявлении структур в C ++ - PullRequest
3 голосов
/ 12 декабря 2010

Лично мне не нравятся старые объявления структур в стиле C, подобные этим:

typedef struct {} NewType;

ctags делает уродливые подобные типы и затрудняет отладку.Есть ли какая-то причина в коде C ++, использующем typedef struct вместо простой struct, за исключением того, что код используется и в C, и в C ++?

С уважением, Валентин

Ответы [ 3 ]

3 голосов
/ 12 декабря 2010

Один из основных недостатков этих

typedef struct tagSomethingSomething SomethingSomething;

означает, что предварительные объявления невозможны с обычно используемым именем typedef'fed.

Да, это C-ism (спасибо sbi), и есть c ++ - кодовые базы, где это - к сожалению - (все еще) распространено.

3 голосов
/ 12 декабря 2010

Это C-ism . В C структуры и перечисления эффективно имеют единые пространства имен, поэтому для

struct NewType {};
enum SomeEnum {};

вам нужно написать struct NewType и enum SomeEnum для ссылки.

В C ++ это не обязательно. Итак, если вы не напишите заголовок, который должен быть проанализирован компилятором C, вы не должны его использовать.

0 голосов
/ 12 декабря 2010

@ sbi: Я думаю, что нет: может быть неправильно, но .. в C ++ это не анонимная структура, есть специальное правило, называемое "взлом структуры", которое делает обычную структуру, помеченную именем typedef, поэтому typedef name также становится именем класса. Это необходимо, потому что функции с внешней связью требуют, чтобы аргументы типа класса тоже имели внешнюю связь, а это подразумевает наличие внешнего имени. Без этого взлома только внешние функции "C" могут манипулировать структурой.

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

struct X { struct {int a; } b; } x;
x.b.a; // OK

struct X имеет внешнюю связь, хотя тип b является анонимным. Анонимные структуры могут использоваться в стеке или в статическом хранилище, но, в отличие от анонимных объединений, это не даст преимущества перед отдельными переменными. Я даже не уверен, что C ++ допускает анонимные структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...