![](/img/trans.png)
[英]Global variable Linked Lists queue in C? (Initializer element is not constant)
[英]'Initializer not constant' on global variable?
因此,在編譯以下代碼時,我得到'initializer element not constant'錯誤:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
float wl = 2.0f;
float k = 2.0f * (float) M_PI / wl;
int main ()
{
//Do stuff
}
如果我在main方法中移動"float k"
,則沒有錯誤,但這對我來說不是一個選項,因為我需要將float k作為全局變量。 即使我改變它:
const float wl = 2.0f;
const float k = 2.0f * (float) M_PI / wl;
錯誤仍然發生。 我該如何解決?
根據C99標准:
§6.7.8初始化
- 具有靜態存儲持續時間的對象的初始化程序中的所有表達式應為常量表達式或字符串文字 。
使用const
在這里沒有用,因為在C中, const
變量不是真正的const。 查看此帖子了解更多詳情。
要解決這個問題,可以使用預處理器使wl
保持不變:
#define wl 2.0f
通過這樣做, 2.0f * (float) M_PI / wl
可以是編譯時常量。
Global
和static
變量在初始化時存儲在數據段(DS)中,在未初始化時存儲在符號開始(BSS)中。 這些變量具有固定的內存位置,並且在編譯時分配內存。
C不允許使用非常量值初始化全局值。
C99 Standard: Section 6.7.8:
All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.
您需要將main
保持聲明中的初始化移動為全局
float wl = 2.0f;
float k ;
int main ()
{
k = 2.0f * (float) M_PI / wl;
//Do stuff
}
在我之上@GoldRanger准確引用了標准,從而解釋了你所遇到的問題。 從技術上講,因為你在k
的初始化中有一個變量,所以它被認為是non-constant
。
要添加一些上下文,我將把它放在這里:
當程序編譯時,它將全局變量放在它們自己的二進制部分中(我不太熟悉linux或windows可執行格式,但在Mac上它們放在__DATA段中)。 所以當你把那行float k = 2.0f * (float) M_PI / wl;
編譯器不夠聰明*足以認識到wl
在編譯時實際上是一個常量,並且你希望用初始值wl
初始化k
。
* smart在這里並不完全正確。 通常,由於wl
未聲明為const,因此表達式通常不是一個常量表達式,因此編譯器對此一無所知。 我想也許這可能是一個語義問題,或者可能只是我和自己就我用過的措辭爭論。
為了做你想做的事情,我通常使用#define
作為我將在整個程序中使用的初始常量:
#define kwlconst 2.0f
float wl = kwlconst;
float k = 2.0f * (float) M_PI / kwlconst;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.