compile-time-constant

___ qstntxt ___

Angenommen, ich habe ein Array, in dem die ersten 10 Primzahlen gespeichert sind:

%Vor%

Das ist alles sehr gut und einfach, solange ich eine .cpp-Datei habe. Wenn ich jedoch mehrere CPP-Dateien habe, weiß ich nicht wirklich, wohin ich dieses Array setzen soll.

Eine naheliegende Lösung wäre das:

%Vor%

Das Problem hierbei ist jedoch, dass das primes-Array keine Kompilierzeitkonstante mehr ist. Nehmen wir an, dass x.cpp einige schwere Berechnungen mit Primzahlen [k] durchführen möchte, wobei k eine Kompilierzeitkonstante hätte, die eine tatsächliche Speichersuche durchführen müsste. Das mag ich nicht.

Also wo stelle ich dieses Array so auf:

  1. Es ist nur einmal in der Binärdatei (nicht einmal pro .cpp-Datei)
  2. array [SOME_CONSTANT] ist auch eine Kompilierzeitkonstante

Bearbeiten

Wie wäre es damit?

%Vor%

PS: Selbst die oben erwähnte "offensichtliche Lösung" hat mich einige Zeit in Anspruch genommen. Offenbar haben const-Variablen standardmäßig eine interne Verknüpfung, daher musste ich der Datei primes.cpp "extern" hinzufügen, damit es funktioniert.

    
___ answer38285524 ___
%Vor%

in einer Header-Datei. Dies kann zu einer größeren ausführbaren Datei führen (jede Quelldatei hat ihre eigene Kopie des Arrays), aber ich denke, das gleiche Problem gilt für die aktuell akzeptierte Antwort.

    
___ answer5046117 ___

Sie könnten enum in einer Kopfzeile verwenden. Enums sind garantiert Kompilierzeitkonstanten und (implizit konvertieren Sie in C ++ 0X Enum-Klasse) zu Ganzzahlen.

    
___ answer5046611 ___

Ich denke, das sollte funktionieren (jetzt aktualisiert, nachdem die Tests von Migi einen Fehler aufgedeckt haben):

%Vor%

(In C ++ gibt es kein Problem, das nicht durch Verwendung mehrerer Vorlagen gelöst werden kann.)

Ein anderer Ansatz:

%Vor%

Schließlich ist keiner dieser Tricks mit einem modernen Linker notwendig, anstatt eine konstante Faltung zu implementieren.

    
___ qstnhdr ___ Wohin mit Arrays zur Kompilierzeitkonstante? ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123compiletimekonstant ___ Verwenden Sie dieses Tag für Fragen zur Kompilierzeitkonstante, einem konstanten Wert, der zur Kompilierzeit bekannt ist. ___ tag123lookuptables ___ Eine Nachschlagetabelle ist ein Array oder eine Matrix von Daten, die Elemente enthält, nach denen gesucht werden kann. Nachschlagetabellen können als Schlüssel-Wert-Paare angeordnet sein, wobei die Schlüssel die gesuchten Datenelemente sind (nachgeschlagen) und die Werte entweder die tatsächlichen Daten oder Zeiger auf den Ort sind, an dem sich die Daten befinden. ___
3
Antworten

Warum werden (konstante) Ausdrücke zur Kompilierzeit in Haskell nicht ausgewertet?

Ich lerne gerade Haskell, und da gibt es eine Sache, die mich verblüfft: Wenn ich einen komplexen Ausdruck erstelle (dessen Berechnung einige Zeit in Anspruch nehmen wird) und dieser Ausdruck konstant ist (dh er besteht nur aus bekannten, fes...
08.10.2013, 21:51
1
Antwort

Top-Level-Ausdruck Auswertung zur Kompilierzeit

Gibt es eine Möglichkeit sicherzustellen, dass ein Ausdruck wie der folgende zur Kompilierzeit ausgewertet wird? %Vor%     
09.07.2016, 12:18
1
Antwort

Wie kann eine Variable sowohl constexpr als auch nicht constexpr sein?

Ich habe einen constexpr string Typ gemacht, den ich StaticString nenne. Ich habe diese Idee von this Website. Ich habe einige seltsame Probleme mit dem Compiler, der eine Variable als constexpr in einer Zeile behandelt und dann ni...
28.05.2016, 22:34
3
Antworten

Wohin mit Arrays zur Kompilierzeitkonstante?

Angenommen, ich habe ein Array, in dem die ersten 10 Primzahlen gespeichert sind: %Vor% Das ist alles sehr gut und einfach, solange ich eine .cpp-Datei habe. Wenn ich jedoch mehrere CPP-Dateien habe, weiß ich nicht wirklich, wohin ich dieses...
18.02.2011, 20:13