Build-Problem mit MSVS 2010 und dem C ++ - Standard

8

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:

  1. Begrenzt c ++ die Anzahl der Typen, die in einer Übersetzungseinheit vorkommen können?

  2. 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)

Gelly Ristor 14.05.2012, 05:48
quelle

2 Antworten

14

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

  
  1. 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.

  2.   
  3. 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].

  4.   
    
Alok Save 14.05.2012, 05:56
quelle
7

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.

    
Alexei Levenkov 14.05.2012 05:56
quelle