2012-10-05 19 views
13

Possible Duplicate:
Error “initializer element is not constant” when trying to initialize variable with constInitializer Element ist nicht konstant in C

Ich bin von JavaScript/PHP/Python kommen und wahrscheinlich etwas, was ich bin fehlt, hier ist der Code:

const int a = 50; 
const int c = 100; 
const int d = 100; 
int endX = c + a; 
int endY = d; 
int startX, startY, b; 

ich

ex1.4.c:6: error: initializer element is not constant
ex1.4.c:7: error: initializer element is not constant

Jemand hat eine Erklärung?

+1

Blick auf das Panel auf der rechten Seite dieser Frage das schon oft gefragt wurde. Bitte durchsuchen Sie diese Website, bevor Sie fragen. –

+0

Ich kann Ihren Code gut kompilieren. Welchen Compiler/System benutzen Sie? – none

+0

@gokcehan: verwenden Sie zufällig einen C++ - Compiler? –

Antwort

4

Wenn Sie EndX als globale Variable deklarieren, ist der Fehler sinnvoll.

Der Grund ist, dass globale Variablen in der Kompilierungszeit initialisiert werden, und Sie versuchen, endX als eine Operation zu initialisieren, die in der Ausführungszeit ausgeführt werden muss.

+4

-1. Diese Antwort ist falsch. Es gibt nichts, was den Compiler daran hindert, endX vor der Ausführungszeit zu berechnen. In der Tat wird g ++ das kompilieren. Es ist nur GCC, der zu sehr darüber skeptisch ist, was er akzeptieren wird. – weberc2

2

Ja, Sie können etwas zu einer Variablen nicht initialisieren. Der Compiler führt die Initialisierung durch und zum Zeitpunkt der Kompilierung kennt er den Wert c+a;

Die Initialisierung des Typs int x = 1; ist in Ordnung, der Compiler fügt nur 1 an die Adresse x im Objektcode ein.

Um etwas zu c+a zu initialisieren, möchten Sie es zur Laufzeit im Startup-Code in c oder Konstruktor in C++ tun.

0

In C-Programmiersprachen müssen Objekte mit statischer Speicherdauer mit konstanten Ausdrücken (oder einem Aggregat mit konstanten Ausdrücken) initialisiert werden. Wenn endX statische Speicherdauer hat, ist sein Initialisierer (c+a) kein konstanter Ausdruck (d. H. Der Ausdruck kann während der Übersetzungsphase nicht ausgewertet werden).

15

Leider sind in C const Variablen nicht wirklich const.

Unten sind die Auszüge von c99 Standard.

6.7.8 Initialization

  1. All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

Die Konstanten sind wie folgt definiert:

6.4.4 Constants

Syntax

constant:

integer-constant  (e.g. 4, 42L) 
floating-constant  (e.g. 0.345, .7) 
enumeration-constant (stuff in enums) 
character-constant  (e.g. 'c', '\0') 

Der Standard konstante Ausdrücke wie folgt definiert: So

6.6 Constant expressions

(7) More latitude is permitted for constant expressions in initializers. Such a constant expression shall be, or evaluate to, one of the following:

— an arithmetic constant expression,

— a null pointer constant,

— an address constant, or

— an address constant for an object type plus or minus an integer constant expression.

(8) An arithmetic constant expression shall have arithmetic type and shall only have operands that are integer constants, floating constants, enumeration constants, character constants, and sizeof expressions. Cast operators in an arithmetic constant expression shall only convert arithmetic types to arithmetic types, except as part of an operand to a sizeof operator whose result is an integer constant.

, c und a nicht konstant ist Ausdrücke und nicht verwendet werden kann, wie Initialisierer in Ihrem Fall.

5

const Ausdrücke müssen eine Kompilierzeitkonstante in C sein, anders als in C++ c+a kann nicht als Konstante verwendet werden. Der übliche Weg, um dieses Problem in C zu handhaben ist, die Präprozessor stattdessen zu verwenden:

#define A 50 
#define C 100 
#define D 100 
int endX = C + A; 
int endY = D; 
int startX, startY, b; 
+1

Wenn 'c' und' a' Kompilierzeitkonstanten sind, dann ist auch 'c + a' (und alles, was diesem Ausdruck zugeordnet ist). Es ist nicht so, dass C++ keine Konstanten als Kompilierzeitkonstante benötigt. es ist, dass C++ intelligent genug ist, um zu erkennen, dass "const int + const int" eine Kompilierzeitkonstante ist, während C nicht so schlau ist. – weberc2

Verwandte Themen