Hm? Das hat doch mit Typen überhaupt noch nichts zu tun. Es existiert ein Symbol, ein zweites Symbol mit demselben Namen wird definiert => Compiler Error.
C++ umgeht das durch Interface Mangling. Entsprechend ist es "bedingt" ein technisches Problem -- Spezifikation und Implementierung gehen Hand in Hand: C-als-Sprache sieht Symbole mit demselben Namen im selben Scope nicht vor, ergo ist es technisch nicht umgesetzt. Ich bin aber relativ sicher, daß man zu der Zeit, als C spezifiziert wurde, auf solche Feinheiten schlicht keinen Wert gelegt hat, Namen umdefinieren zu können im Sinne irgendeiner Polymorphie.
Warum auch? Wenn ich ein bool today definiere, dann hab ich vermutlich gemeint "heutiger Tag, ja/nein" und wenn ich dann komme mit datetime today, dann meine ich vermutlich was anderes und wenn mir die Sprache (egal welche!) das verbietet, dann kommt mir das zugute und schränkt mich eben NICHT (unnütz) ein.
Exakt diese Deklaration ist, aus Sicht des Programmierers, exakt der Grund, warum man das macht. C verlangt es vom Programmierer, aber wenn man jetzt VB hernimmt (oder VBS) oder PowerShell, da macht es einen gravierenden Unterschied, ob ich mir meine Variable deklariere, sie einfach so verwende und/oder typisiere: im ersteren Fall weiß der Compiler, was es sein soll und kann entsprechend Platz reservieren; im zweiteren muß er vom worst case ausgehen, hat keine Angaben über das "was" und wird entsprechend meinen bool von oben aus dem Beispiel mit einem datetime oder einem unsigned long oder sonstwomit überschreiben, ohne daß ich das merke, oder wird wie bei VB(s) oder PS einfach eine neue Variable anlegen, wenn ich mich verschrieben hab.
MIT Option Explicit bzw. Typdeklaration in VB(s) und PS krieg ich dann den erwünschten Compilerfehler(VB) bzw Laufzeitfehler (PS läuft in einer VM, streng genommen ist es also auch ein Compilerfehler, aber man kompiliert ja nicht selber und merkt es daher erst zur Laufzeit, daß da was nicht paßt).