Siehe diese vorherige Antwort auf eine verwandte Frage. Es ist eine lange Zitat aus einem Dan Saks Artikel, der dieses Problem so klar wie alles erklärt ich kenne:
Difference between 'struct' and 'typedef struct' in C++?
Die Technik tatsächlichen Probleme verhindern kann (obwohl zugegebenermaßen selten Probleme).
Es ist ein billiges Stück Versicherung - es kostet keine Kosten zur Laufzeit oder im Coderaum (die einzigen Kosten sind die wenigen Bytes in der Quelldatei), aber der Schutz ist so klein, dass es ungewöhnlich ist, jemanden zu sehen konsequent. Ich habe ein "neues Klassen" -Snippet, das das Typedef enthält, aber wenn ich tatsächlich eine Klasse von Grund auf neu programmiere, ohne das Snippet zu verwenden, mache ich mir fast keine Mühe (oder erinnere ich mich?), Das Typedef hinzuzufügen.
Also würde ich sagen, dass ich mit den meisten der Meinungen nicht einverstanden sind hier gegeben - es lohnt sich, diese typedefs in, aber nicht genug setzen, dass ich jemand geben würde (mich eingeschlossen) Trauer um sie nicht bei der Umsetzung
.
ich habe ein Beispiel dafür, wie man einen Klassennamen mit typedef kann zu unerwartetem Verhalten führt gefragt - hier ein Beispiel mehr oder weniger aus dem Saks Artikel gehoben:
#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;
}
Wenn die Funktion Erklärung abgegeben wird sichtbar, ändert sich das Verhalten des Programms im Hintergrund, da zwischen der Funktion foo
und der cla kein Namenskonflikt besteht ss foo
.
Wenn Sie jedoch eine "typedef class foo foo;
" einschließen, erhalten Sie einen Kompilierzeitfehler anstelle eines stillen Unterschieds im Verhalten.
vielleicht sollten Sie diese Person fragen? anstatt alle außer dieser Person zu fragen. – DevinB
Ich wollte einen Konsens darüber finden, ob es das wirklich wert ist, und nicht die Erklärung einer Person. –
Und der Typ war eigentlich falsch. "Nicht-Tag versteckt den Tag-Namen in C++" - weder wahr in C noch wahr in C++. Für einige Inspiration, lesen Sie diesen Fehlerbericht http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407 –