Вот различие между этими двумя декларациями/определениями:
1) Вы не можете использовать ЬурейеЕ имя для идентификации конструктора или деструктора
struct MyStruct { MyStruct(); ~MyStruct(); }; // ok
typedef struct { MyStructTD(); ~MyStructTD(); } MyStructTD; // not ok
// now consider
typedef struct MyStruct2 { MyStruct2(); } MyStructTD2; // ok
MyStructTD2::MyStruct2() { } // ok
MyStructTD2::MyStructTD2() { } // not ok
2) Вы не можете скрыть имя typedef, как вы можете имя, введенное через класс-руководитель, или, наоборот, если у вас уже есть функция или объект с определенным именем, вы все равно можете объявить класс с этим именем, используя класс-голова, но не с помощью метода typedef.
struct MyStruct { }; // ok
typedef struct { } MyStructTD; // ok
void MyStruct() { } // (1) - ok Hides struct MyStruct
void MyStructTD() { } // (2) - not-ok - ill-formed
//> Or if you flip it around, consider in a new translation unit:
void MyStruct() { } // ok
void MyStructTD() { } // ok
struct MyStruct { }; // ok
typedef struct { } MyStructTD; // Not ok
3) Вы не можете использовать имя ЬурейеЕ в уточненной спецификатор типа
struct MyStruct { }; // ok
typedef struct { } MyStructTD; // ok
int main()
{
void MyStruct();
void MyStructTD(); // ok - new declarative region
struct MyStruct ms; // ok - names the type
struct MyStructTD ms2; // not ok - cannot use typedef-name here
}
struct AnotherStruct
{
friend struct MyStruct; // ok
friend struct MyStructTD; // not ok
};
4) Вы не можете использовать его, чтобы определить вложенное Структуры
struct S { struct M; };
typedef struct { } S::M; // not ok
struct S::M { }; // ok
Как вы можете видеть, существует заметная разница между ними. Некоторые из причуд typedefs являются результатом совместимости C (что в основном связано с тем, что оба пути существуют, я считаю) - и в большинстве случаев объявление названия в классе-голове более естественное C++ - оно имеет свои преимущества (особенно когда вы необходимо определить конструкторы и деструкторы), и поэтому предпочтительнее. Если вы пишете код, который должен быть совместимым с C и C++, тогда есть преимущество в использовании обоих подходов. Но если вы пишете чистый C++, я считаю, что определение имени класса в классе-голове должно быть более читаемым.
Это дубликат http://stackoverflow.com/questions/612328/difference-between -struct-and-typedef-struct-in-c, но я не собираюсь голосовать за закрытие, потому что принятый ответ на этот вопрос (тонко) ошибочен, как объяснялось во втором голосовавшем ответе ... –