2009-04-08 4 views
0

Von dem, was ich verstehe, #define x y und const int x = y; sollte identisch unter dem Visual Studio-Compiler funktionieren, aber const int x = y; ist die bevorzugte Methode.Problem mit const vs #define in Visual Studio

Der C-Code Ich habe sieht wie folgt aus etwas:

static const int x = 100000; 

void SomeFunction(...) 
{ 
    volatile static int y = x; 
    ... 
} 

Das Problem mit der Erklärung von y ist. Wenn ich ein #define für x verwende, dann gibt es keine Probleme, aber die Verwendung des obigen Codes führt dazu, dass der Compiler mit "Fehler c2099: Initialisierer ist keine Konstante" zurückkehrt.

Ich versuche, von der Befehlszeile zu kompilieren, und ich verwende keine Compiler-Flags, also bin ich mir nicht sicher, ob ich ein Flag setzen muss, damit der Compiler das const - or optimiert wenn ich auf irgendeinen Sonderfall stolperte.

Kompilieren des Programms als C++ - Programm funktioniert auch, aber ich würde das lieber vermeiden, wenn möglich.

+0

Beachten Sie, dass wenn Sie #define verwenden, x nicht explizit eingegeben wird ... –

+0

Ihre Probe kompiliert für mich gut. – zdan

+1

Kompilieren Sie es als eine C-Datei und nicht als eine CPP-Datei? – Swiss

Antwort

2

Ich kenne den C-Standard nicht von innen, aber ich habe darüber schon einmal gelesen. Hier ist mein Verständnis.

Ein strenger ANSI C-Compiler erlaubt Ihnen nur, konstante Ausdrücke als Initialisierer zu verwenden. Beachten Sie, dass ein konstanter Ausdruck nur Literalwerte und keine Konstanten enthalten kann.

Ich glaube, das liegt daran, dass der Compiler während der Kompilierung den zu initialisierenden Wert berechnen muss, damit er diesen Wert statisch auf den Stack schieben kann, ohne dass zur Laufzeit Berechnungen erforderlich sind. Sogar const-qualifizierte Variablen können sich ändern (durch Entfernen des const-Qualifiers und Ändern des Wertes).

const int x = 5; 
*(int *)&x = 3; 

Ich denke, C99 Sie mit const qualifizierten Variablen im Funktionsumfang nur noch Datei-scope Variablen durch die gleiche Beschränkung gebunden initialisieren können.

+0

Ändern des Wertes einer const qualifizierten Variable ist undefiniertes Verhalten - das Standard-Komitee würde es nicht wegen der Möglichkeit eines undefinierten Verhaltens verbieten –

+0

Ich bin sicher, es ist undefiniertes Verhalten, aber weil es undefiniertes Verhalten ist, könnten einige Compiler theoretisch Erlaube die Initialisierung von Konst-Variablen. Microsofts C-Compiler funktioniert natürlich nicht :( – dreamlax

0

Dies könnte mit einer anderen Wache Variable gelöst werden:

void SomeFunction(...) 
{ 
    static int initialized_y=0; 
    volatile static int y; 
    if(initialized_y==0) 
     y = x; 
    initialized_y=1; 
    ... 
} 

Sie können auch dieses Idiom in ein Makro drehen.