2012-10-05 50 views
13

Possible Duplicate:
Error 「initializer element is not constant」 when trying to initialize variable with const初始化器元素是不是在C常量

我從JavaScript/PHP/Python的未來,也許我失去了一些東西,這裏是代碼:

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

我得到

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

有人有解釋嗎?

+1

看看在這個問題上這已經被問過很多次的右側面板。請在詢問之前搜索此網站。 –

+0

我可以編譯你的代碼就好了。你在使用什麼編譯器/系統? – none

+0

@gokcehan:你有沒有使用C++編譯器? –

回答

4

如果您將endX聲明爲全局變量,則錯誤是有意義的。

原因是全局變量在編譯時被初始化,並且您試圖將endX初始化爲必須在執行時執行的操作。

+4

-1。這個答案是錯誤的。在執行時間之前,沒有什麼能夠阻止編譯器計算endX。事實上,g ++會很高興地編譯這個。這只是海灣合作委員會對於它將接受的內容過於粗暴。 – weberc2

2

是的,你不能初始化某個變量。編譯器執行初始化,並且在編譯時它不知道c+a的值;

int x = 1;類型的初始化是好的,編譯器只是在目標代碼中的x的地址1

要初始化某些內容到c+a,您希望在運行時,啓動代碼c或構造函數C++中執行此操作。

0

在C程序設計語言研究,具有靜態存儲持續時間的對象必須使用常量表達式(或含有常量表達式集合)被初始化。如果endX具有靜態存儲持續時間,它的初始值設定(c+a)不是一個常量表達式(即,表達不能在翻譯階段評價)。

15

不幸的是,在C const變量不是真正的常量。

以下是c99標準的摘錄。

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.

常數的定義如下:

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') 

該標準定義如下常量表達式:

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.

因此,ca不是常量表達式,並且不能被用作初始化器在你的情況。

5

const與C++不同,表達式必須是C語言中的編譯時間常量,因此c+a不能用作常量。處理用C這個問題的常用方法是使用預處理代替:

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

如果'c'和'a'是編譯時間常量,那麼'c + a'也是(以及該表達式賦予的任何東西)。並不是說C++不要求const表達式是編譯時常量;就是說C++足夠聰明地認識到'const int + const int'是一個編譯時間常量,而C並不那麼聰明。 – weberc2