Zobacz poprzednią odpowiedź na pokrewne pytanie. To długi cytat z artykułu Dan Saks, który wyjaśnia tę kwestię tak wyraźnie, jak cokolwiek Natknąłem:
Difference between 'struct' and 'typedef struct' in C++?
Technika ta może zapobiec rzeczywistych problemów (choć co prawda rzadkich problemów).
To taniego ubezpieczenia - to zero kosztów w środowisku wykonawczym lub w przestrzeni kodu (jedynym kosztem jest kilka bajtów w pliku źródłowym), ale ochrona, jaką otrzymujesz, jest tak mała, że nieczęsto zdarza się, że ktoś z niej korzysta konsekwentnie. Mam fragment kodu "nowej klasy", który zawiera typedef, ale jeśli faktycznie zakodowałem klasę od zera bez użycia tego fragmentu, prawie nigdy nie zawracam sobie głowy (lub nie pamiętam?), Aby dodać typedef.
Więc powiedziałbym, nie zgadzam się z większością opinii wydanych tutaj - warto umieszczenie tych typedefs w, ale nie na tyle, że dałbym każdemu (w tym ja) nie żal o umieszczenie ich w
.
poproszono mnie na przykład, jak nie o nazwę klasy typedef'ed może spowodować nieoczekiwane zachowanie - oto przykład podnoszone mniej więcej z artykułu Saks:
#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;
}
Jeżeli deklaracja funkcja jest wykonana widoczne, zachowanie programu po cichu zmienia się, ponieważ nie ma konfliktu nazw między funkcją foo
a klauzulą ss foo
.
Jeśli jednak podasz "typedef class foo foo;
", otrzymasz błąd czasu kompilacji zamiast cichej różnicy w zachowaniu.
Może powinieneś zapytać tę osobę? zamiast prosić wszystkich, ale tę osobę. – DevinB
Chciałem uzyskać consensus, jeśli rzeczywiście jest tego wart, a nie wyjaśnienie jednej osoby. –
A facet rzeczywiście był w błędzie. "non-tag ukrywa nazwę znacznika w C++" - nie jest prawdziwe w C, ani prawdziwe w C++. Dla pewnej inspiracji przeczytaj ten raport o usterkach http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407 –