Wohin mit Arrays zur Kompilierzeitkonstante?

8

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.

    
Migi 18.02.2011, 20:13
quelle

3 Antworten

5

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.

    
Ben Voigt 18.02.2011, 21:10
quelle
1

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

    
Damon 18.02.2011 20:19
quelle
0
%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.

    
Marian Spanik 09.07.2016 19:23
quelle