Bei der Diskussion von Entwurfsmöglichkeiten für ein Projekt mit sehr vielen zu definierenden Konstanten und Bitmustern stellte sich die Frage, wie viele #defines ein Standard-Compiler handhaben kann? Ich nehme an, es ist eine sehr große Zahl, aber wir waren neugierig zu wissen, ob es eine tatsächliche Obergrenze gibt.Gibt es eine Grenze für die Anzahl der #defines, die die GCC- und VC++ - Vorprozessoren verarbeiten können?
Antwort
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.
Ich habe noch nie davon gehört, dass jemand ausgeht. Je.
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.
"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. –
@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. –
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. –
- 1. Redis: Gibt es eine Grenze für die Anzahl der Schlüssel, die ich speichern kann?
- 2. Gibt es eine Grenze für die Anzahl der Zeilen, die in einen einzelnen css-Befehl eingegeben werden können?
- 3. Gibt es eine Grenze für die Anzahl der verschiedenen Marker, die Sie in einer Fusionsebene haben können?
- 4. Gibt es ein Limit für die Anzahl der UIApplicationShortcutItems, die Sie haben können?
- 5. Python XLSXWRITE Gibt es eine Begrenzung für die Anzahl der Spalten, die erstellt werden können?
- 6. Gibt es eine Begrenzung für die Anzahl der PubSub-Themen, die abonniert werden können?
- 7. Gibt es eine Grenze für die Anzahl der TCP/IP-Verbindungen zwischen Maschinen unter Linux?
- 8. gibt es eine Grenze für die Anzahl der sk_buffs im Kernel
- 9. Gibt es eine Grenze für die Anzahl der Artikel in HTML-Form gesendet?
- 10. RIA-Dienste: Gibt es eine Grenze für die JSON-Deserialisierung?
- 11. Theoretische Grenze für die Anzahl der Schlüssel (Objekte), die in einer HashMap gespeichert werden können?
- 12. Gibt es eine Grenze für die Anzahl der asynchronen Aufrufe von Urletch, die ich gleichzeitig ausführen kann?
- 13. Praktische Grenze für die Anzahl der Datenbanken in SQL Server?
- 14. Gibt es eine Begrenzung für die Anzahl der Codezeilen, die Sie in eine Eclipse Java Doument setzen können?
- 15. R - gibt es eine Grenze, um Daten, die
- 16. VC++ # Importanweisung für GCC/G ++
- 17. Max Grenze für die Anzahl der RDDs in Spark
- 18. nicht verarbeiten können Standorte und Klassen für die Kontextkonfiguration
- 19. gibt es eine Begrenzung für die Anzahl der Threads, die Ruby auf einmal ausführen kann?
- 20. Gibt es eine Begrenzung für die Anzahl der Marker, die auf Google Static Maps platziert werden können?
- 21. Gibt es eine Begrenzung für die Anzahl der Klassen, die ein Namespace in .net haben kann?
- 22. Gibt es eine alternative Möglichkeit, eine zusätzliche Grenze anzugeben, wenn die erste Grenze ein Typparameter ist?
- 23. Gibt es eine Option für gcc, die die Flag -g verwirft?
- 24. Gibt es Entwicklungsmuster, die einen IntentService für Netzwerkanforderungen ersetzen können?
- 25. Gibt es eine maximale Anzahl von Kategorien, die in der Yelp-API zurückgegeben werden können?
- 26. Gibt es eine maximale Javascript-Dateigröße, was können Browser verarbeiten?
- 27. MySQL Gibt es eine Grenze für InnerJoin?
- 28. Gibt es eine Größenbeschränkung für Json-Objekte, die von Browsern verarbeitet werden können?
- 29. Gibt es eine Grenze pro IP-Adresse für die Twitter-Streaming-API?
- 30. Gibt es eine Grenze für die Pull-Nummer in Docker Hub
Danke. Ja, ich werde wahrscheinlich das Auto-Generate-Experiment ausprobieren, nur um zu grinsen ... –