2016-04-26 10 views
0

In einem gehosteten System muss der Standard main mit einem "deklarierten Rückgabetyp des Typs int" definiert werden. Das "erklärt" gehört zu "abgeleiteten Rückgabetypen", so dass wir dieses Wort für die Zwecke dieser Frage ignorieren können. In C enthält der Standard explizit eine Fußnote, die besagt, dass typedef für int verwendet werden kann, aber dies fehlt im C++ - Standard. Ich gehe davon aus, die Absicht ist die gleiche wie die Sprache ist "Rückgabetyp des Typs int" und "eine Funktion von() int zurückgeben" und ein typedef ist einfach ein Alias, kein anderer Typ. Daher würde dieses Programm als legal betrachtet werden:Wie legal ist diese Definition von `main`?

typedef int boobs; 
boobs main() { } 

Was, wenn wir das stattdessen tun?

#include <cstdint> 

int32_t main() {} 

Auf vielen Systemen diese als int32_t kompiliert nur int aber nicht alle Systeme. Meine Verwirrung rührt von der Tatsache her, dass int32_t ein implementierungsdefinierter Wert ist, was bedeutet, dass der Kompilierungsfehler von der Implementierung abhängt.

Also, was ist die Rechtmäßigkeit dieser Situation? Ist das gesamte Programm schlecht aufgebaut, weil es manchmal kompilieren kann oder nicht? Oder ist es wohlgeformt, weil es auf einen implementierungsdefinierten Wert ankommt, der von der Standardbibliothek kommt?

+0

'so können wir dieses Wort für die' ignorieren - lassen Sie mich aus diesem –

+1

, was wäre der Nutzen von diesem? Ich meine, wenn es nur funktioniert, wenn 'int32_t' nur' int' ist, dann könntest du auch 'int' an erster Stelle verwenden – user463035818

+1

" Kompilierungsfehler hängt von der Implementierung ab "--- ja, das kann passieren, es ist nichts Ungewöhnliches – Brian

Antwort

4

Das Programm ist gut gebildet, wenn und nur wenn int32_t ein Alias ​​(ein typedef) von int ist.

Offensichtlich ist die Verwendung von nicht deklarierten int32_t in Systemen, die int32_t unterstützen (feste Breite ganze Zahlen sind optional) nicht zulässig.

Auch wenn int32_t vom Compiler unterstützt wird, ist es nicht erforderlich, es in dem globalen Namensraum im <cstdint> Header zu erklären (nur std::int32_t garantiert ist), so setzt das Programm auf diesem Aspekte der Umsetzung.

Auch in Systemen, in denen int32_t ein anderer Typ als int ist, wird das Programm schlecht gebildet.

So ist es implementiert, ob das Programm gut gebildet ist oder nicht. Auf einigen Systemen ist es; bei anderen ist es nicht. Um es noch knapper zu formulieren, das Programm ist bedingt gut gebildet.