Nicht wirklich. Der C-Standard legt keine absoluten Mindestgrenzen für Übersetzungseinheiten fest, die akzeptiert werden müssen. Als solches würde eine vollkommen genaue checker trivial zu schreiben, aber völlig nutzlos in der Praxis:
#include <stdio.h>
int main(int argc, char **argv) {
int i;
for (i=1; i<argc; i++)
fprintf(stderr, "`%s`: Translation limit (potentially) exceeded.\n", argv[i]);
return 0;
}
Ja, das lehnt alles, egal wie trivial. Das entspricht dem Standard. Wie gesagt, es ist in der Praxis absolut nutzlos. Leider können Sie nicht wirklich viel besser machen - wenn Sie sich entscheiden, auf eine andere Implementierung zu portieren, könnten Sie auf ein seltsames Ressourcenlimit stoßen, das Sie noch nie zuvor gesehen haben, also jeden Code, den Sie schreiben (bis zu einem einschließlich " hallo world ") könnte möglicherweise ein Ressourcenlimit überschreiten, obwohl es von Dutzenden oder sogar Hunderten von Compilern auf/für viel kleinere Systeme erlaubt ist.
Edit:
Warum ein „Hallo Welt“ Programm nicht streng
Zuerst konform ist, ist es wert, wieder unter Angabe der Definition von „streng konform“: „Eine streng konformen Programm verwenden soll nur diejenigen Merkmale der Sprache und Bibliothek, die in dieser Internationalen Norm festgelegt sind.2) Sie darf keine Ausgabe erzeugen, die von einem nicht spezifizierten, undefinierten oder implementationsdefinierten Verhalten abhängt, und darf keine minimale Implementierungsgrenze überschreiten. "
Es gibt tatsächlich eine Nummer Gründe "Hallo, Welt" ist nicht streng konform. Erstens, wie oben angedeutet, sind die Mindestanforderungen für die Umsetzungsgrenzen völlig bedeutungslos - obwohl es einige Programm geben muss, das bestimmte Grenzen erfüllt, die akzeptiert werden, kein anderes Programm muss akzeptiert werden, auch wenn es nicht ' Ich komme sogar einer dieser Grenzen nahe. In Anbetracht der Art und Weise, in der die Anforderung formuliert wird, kann (bestenfalls) in Frage gestellt werden, ob es ein Programm gibt, das eine Mindestumsetzungsgrenze nicht überschreitet, da der Standard keine Mindestumsetzungsgrenzen definiert.
Zweitens, während Phase 1 der Übersetzung: "Physikalische Quelldatei Multibyte-Zeichen werden in einer Implementierung definiert, um den Quellzeichensatz zugeordnet ..." (§5.1.1.2/1). Seit "Hallo, Welt!" (oder welche Variante Sie auch bevorzugen) wird als String-Literal in der Quelldatei angegeben, sie kann in einer implementierungsdefinierten Weise dem Quellzeichensatz zugeordnet werden. Eine Implementierung kann frei entscheiden, dass String-Literale (für ein idiotisches Beispiel) ROT13-kodiert sind und solange diese Tatsache richtig dokumentiert ist, ist sie vollkommen legitim.
Drittens wird der Ausgang normalerweise über stdout
geschrieben. stdout
ist ein Text-Stream. Gemäß dem Standard: "Zeichen müssen möglicherweise bei Eingabe und Ausgabe hinzugefügt, geändert oder gelöscht werden, um unterschiedlichen Konventionen für die Darstellung von Text in der Host-Umgebung zu entsprechen. Daher muss keine Eins-zu-Eins-Entsprechung zwischen den Zeichen bestehen in einem Strom und diejenigen in der äußeren Darstellung. " (§7.19.2/2) Als solche könnte eine Implementierung (zum Beispiel) eine Huffman-Komprimierung an der Ausgabe (am Montag, Mittwoch oder Freitag) durchführen.
So haben wir (mindestens) drei verschiedene Punkte, an denen die Ausgabe von einem "Hallo, Welt!" hängt von implementationsdefinierten Merkmalen ab - von denen jede verhindern würde, dass sie die Definition eines streng übereinstimmenden Programms erfüllt.
Ihr Beispiel ist fantastisch. Ich habe nie über solche einfachen Zeigerausdrücke nachgedacht. Ich glaubte, dass jeder dieser undefinierten Zustand zu Beginn der Untersuchung entdeckt werden konnte. – alecov
Ihr Beispiel ist in Ordnung, auch wenn 'p == q' - vielleicht meintest du' * p = (* q) ++ ', was undefiniert ist, wenn' p == q'? – caf