2011-01-14 6 views

Antwort

7

Für einen "Standard-Compiler":

5.2.4.1: "Die Übersetzung limits"

Die Umsetzung muss in der Lage sein zu übersetzen und führen mindestens ein Programm, das mindestens eine enthält Instanz von jedem der folgenden Grenzen

...

4095 Makroidentifizierer gleichzeitig in einer Vorverarbeitung Übersetzungseinheit definiert

Notiere die etwas seltsame Art und Weise das Erfordernis der Phrasierung. Implementierungen könnte erfüllen, indem sie ein einzelnes "goldenes Programm" haben, das sie als einen speziellen Fall erkennen und kompilieren, obwohl das Riggingbenchmarks ähnlich wäre. In der Praxis können Sie den Standard lesen, wenn Ihre Implementierung ein anderes Limit als den verfügbaren Arbeitsspeicher festlegt, sollte das Limit mindestens 4095 sein. Beyond 4095 verlassen Sie sich in gewissem Maße auf implementierungsspezifisches Verhalten.

Einige Compiler (Microsoft) auferlegen einige Implementierungsgrenzen, die weniger als der Standard sagt. Diese sind irgendwo auf MSDN aufgeführt, denke ich, aber möglicherweise nur für C++. Soweit C geht, da ich C99 anführe, ist es für MSVC sowieso nicht relevant. Für GCC und MSVC im Besonderen sollte es nicht zu schwierig sein, zu testen, ob eine bestimmte Implementierung ein willkürliches Limit auferlegt, vielleicht einfacher, als das Dokument zu finden :-) Automatisch Dateien erzeugen, die nur große lange Listen von #define enthalten , sehen Sie, was der Präprozessor von ihnen macht.

+0

Danke. Ja, ich werde wahrscheinlich das Auto-Generate-Experiment ausprobieren, nur um zu grinsen ... –

2

Ich habe noch nie davon gehört, dass jemand ausgeht. Je.

0

Der C-Präprozessor wird #define nicht erweitert, bevor sie tatsächlich verwendet werden. In einer typischen Implementierung ist das einzige Limit, auf das Sie stoßen können, der Speicher, um all das zu speichern. Aber dieser Speicher zum Speichern der internen Repräsentation der Makros wird grundsätzlich höchstens etwas sein, das proportional zur Größe der vom Compiler gelesenen Dateien ist.

(Gut Sie auch mehrere Aufnahme von Dateien tun könnte ...)

Sie könnten eine Vorverarbeitung durch den Ausbau tief verschachtelte Makros ausführen, explodieren, denke ich. So etwas wie

#define EXP1(X) X X 
#define EXP2(X) EXP1(X) EXP1(X) 
#define EXP3(X) EXP2(X) EXP2(X) 
. 
. 
#define EXP64(X) EXP63(X) EXP63(X) 
EXP64(A) 

sollte den Trick tun, da es Ihnen 2^64 Kopien von A oder so gibt. AFAIR, diese Makrodefinitionen liegen sogar innerhalb der Grenzen, die der Standard vorgibt.

+0

"diese Makrodefinitionen sind sogar innerhalb der Grenzen, die der Standard auferlegt" - nicht so sehr innerhalb "4095 Zeichen in einer logischen Quellzeile", denke ich, dass sich auf Zeilen nach der Vorverarbeitung bezieht. –

+0

@Steve: die Makrodefinitionen sind, aber nicht die eine Erweiterung von ihnen. Aber du könntest sogar 'EXP()' machen, dann könnten angrenzende Leerzeichen {sh | c | w} zusammen geklebt werden, und trotzdem würde die Zusammenstellung explodieren. –

+0

vereinbart, ist es möglich, den Preprozessor/Compiler nicht mehr genügend Arbeitsspeicher zu haben, ohne die im Standard erwähnten spezifischen Grenzen zu überschreiten. –

Verwandte Themen