См. Предыдущий ответ на соответствующий вопрос. Это длинная цитата из статьи Дэн Сакс объясняет, что этот вопрос так ясно, как все, что я пришел через:
Difference between 'struct' and 'typedef struct' in C++?
Методика может предотвратить реальные проблемы (хотя по общему признанию редких проблем).
Это дешевая страховка - это нулевая стоимость во время выполнения или в кодовом пространстве (единственная стоимость - это несколько байтов в исходном файле), но защита, которую вы получаете, настолько мала, что редко можно увидеть, как кто-то ее использует последовательно. У меня есть «новый класс», который включает в себя typedef, но если я на самом деле код класса с нуля без использования фрагмента, я почти никогда не беспокоюсь (или не помню?), Чтобы добавить typedef.
Так что я бы сказал, что я не согласен с большинством мнений, приведенных здесь - это стоит поместить эти в определений типов, но не достаточно того, что я дал бы кто-нибудь (в том числе и я) пожалеть о том, не помещая их в
.
Я попросил пример того, как не имеющее имя класса typedef'ed может привести к неожиданному поведению - вот пример поднял более или менее из статьи Сакса:
#include <iostream>
#include <string>
using namespace std;
#if 0 // change to #if 1 to get different behavior
// imagine that this is buried in some header
// and even worse - it gets added to a header
// during maintenance...
string foo()
{
return "function foo... \n";
}
#endif
class foo
{
public:
operator string() {
return "class foo...\n";
}
};
int main()
{
string s = foo();
printf("%s\n", s.c_str());
return 0;
}
при объявлении функции производятся видимо, поведение программы бесшумно изменяется, потому что между функцией foo
и кланом нет конфликта имен ss foo
.
Однако, если вы включите «typedef class foo foo;
», вы получите ошибку времени компиляции вместо молчаливой разницы в поведении.
Возможно, вы должны спросить этого человека? а не просить всех, кроме этого человека. – DevinB
Я хотел получить консенсус относительно того, действительно ли это того стоит, а не объяснения одного человека. –
И парень на самом деле был неправ. «non-tag скрывает имя тега в C++» - ни true в C, ни true в C++. Для некоторого вдохновения прочитайте этот отчет о дефектах http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407 –