Ich versuche, mit msvs 2010 das Projekt zu erstellen, das am folgenden Git gefunden wurde:
Das Problem ist, wenn ich die Zeile 48 '#define exprtk_lean_and_mean' in der Datei exprtk.hpp auskommentiere, bekomme ich den folgenden Compilerfehler:
%Vor%Das Googeln des Fehlers scheint darauf hinzuweisen, dass die kompilierte Übersetzungseinheit zu etwas größerem als einem arbitrariy limit kompiliert wurde, und das Hinzufügen von 'bigobj' zur Befehlszeile sollte das Problem beheben (was es tut). Das Kompilieren des Codes mit gcc (4.3) funktioniert ohne Fehler.
Meine Fragen sind:
Begrenzt c ++ die Anzahl der Typen, die in einer Übersetzungseinheit vorkommen können?
Ist die Art und Weise, wie der Code in diesem Projekt schlecht angelegt ist? (Beim googeln ist mir aufgefallen, dass viele Boost-Bibliotheken das gleiche Problem haben, zB Boost.Sprit)
Begrenzt c ++ die Anzahl der Typen, die in einer Übersetzungseinheit vorkommen können?
Beachten Sie, dass die Maximalwerte solcher Parameter für bestimmte Implementierungen offen bleiben. Der Standard erzwingt nur Mindestanforderungen, die von einer Implementierung unterstützt werden müssen. Eine Implementierung dokumentiert die maximalen Werte, die sie unterstützt, und in diesem Fall erfolgt die MSVC-Implementierung.
Diese sind in einem speziellen Abschnitt des C ++ - Standards definiert.
Anhang B - Umsetzungsmengen
Da Computer endlich sind, sind C + + Implementierungen zwangsläufig begrenzt in der Größe der Programme können sie erfolgreich verarbeiten. Jeder Umsetzung dokumentiert diese Einschränkungen wo bekannt. Dies In der Dokumentation können feste Grenzen genannt werden Wo sie existieren, sage, wie man berechnet variable Grenzen als Funktion von verfügbare Ressourcen, oder sagen, dass behoben Grenzen existieren nicht oder sind unbekannt.
Die Limits können Mengen einschränken, die die unten beschriebenen oder beinhalten Andere. Die Klammernummer folgt Jede Menge wird als empfohlen Minimum für diese Menge. Diese Mengen sind nur Richtlinien und bestimmen nicht die Einhaltung.
- Verschachtelung von zusammengesetzten Aussagen, Iterationskontrollstrukturen und Auswahlkontrollstrukturen [256].
- Schachtelungsebenen von bedingten Aufnahme [256].
- Zeiger, Array und Funktion Deklaratoren (in jedem Kombination) eine Arithmetik modifizieren, Struktur, Union oder unvollständiger Typ in einer Erklärung [256].
- Nesting Ebenen von eingeklammerten Ausdrücken innerhalb eines vollständigen Ausdrucks [256].
- Anzahl der Zeichen in einem internen Bezeichner oder Makroname [1 024].
- Anzahl der Zeichen in einem externen Bezeichner [1 024].
- Extern Identifikatoren in einer Übersetzungseinheit [65 536].
- Identifikatoren mit Block Umfang in einem Block deklariert [1 024].
- Makrobezeichner gleichzeitig definiert in einer Übersetzungseinheit [65 536].
- Parameter in einer Funktion Definition [256].
- Argumente in einem Funktionsaufruf [256]. **
- Parameter in eine Makrodefinition [256].
- Argumente in einem Makroaufruf [256].
- Charaktere in einem logischen Quellzeile [65 536].
- Charaktere in eine Zeichenfolge literal oder breit String-Literal (nach Verkettung) [65 536].
- Größe eines Objekts [262 144] .
- Verschachtelungsebenen für #include Dateien [256].
- Fall Etiketten für a switch statement (ausgenommen diejenigen für irgendwelche verschachtelten Switch-Anweisungen) [16 384].
- Datenmitglieder in einem einzigen Klasse, Struktur oder Vereinigung [16 384].
- Aufzählungskonstanten in einem einzigen Aufzählung [4 096].
- Ebenen von geschachtelte Klasse, Struktur oder Union Definitionen in einem einzigen struct-Deklarationsliste [256].
- Von atexit eingetragene Funktionen () [32].
- Direkte und indirekte Basisklassen [16 384].
- Direkte Basisklassen für a einzelne Klasse [1024].
- Mitglieder in einer einzigen Klasse erklärt [4 096].
- Letzte übergeordnete virtuelle Funktionen in eine Klasse, zugänglich oder nicht [16 384].
- Direkte und indirekte virtuelle Basen von a Klasse [1 024].
- Statische Mitglieder eines Klasse [1 024].
- Freundschaftsdeklarationen in einer Klasse [4 096].
- Zugriffskontrolle Deklarationen in einer Klasse [4 096].
- Mitgliedsinitialisierer in einem Konstruktor Definition [6 144].
- Umfang Qualifikationen eines Identifikators [256].
- Geschachtelte externe Spezifikationen [1 024].
- Vorlage Argumente in einer Template-Deklaration [1 024].
- Rekursiv verschachtelte Vorlage Instanziierungen [17].
- Handler per versuche Block [256].
- Werfen Spezifikationen für eine einzelne Funktion Erklärung [256].
Die Einschränkung liegt innerhalb des OBJ-Formats, das von alten Versionen von MSVC und entsprechenden Linkern verwendet wird. Obwohl diese Einschränkung willkürlich ist, kann sie nicht als Standardverhalten für neue Versionen von Compilern verwendet werden. Sehen Sie sich die Beschreibung der Option / bigobj an:
Linker, die vor Visual C ++ 2005 ausgeliefert wurden, können keine .obj-Dateien lesen, die mit / bigobj erstellt wurden.
Tags und Links c++ visual-c++ standards compiler-errors