簡體   English   中英

從c中的函數初始化一個靜態const變量

[英]Initialising a static const variable from a function in c

我最近在嘗試執行以下邏輯時遇到了一些麻煩:

static const int size = getSize();

int getSize() {
    return 50;
}

我收到的錯誤是initialiser element is not constant

在線閱讀后我明白這個問題是因為編譯器在編譯時評估static const表達式,因此無法知道該值應該是什么。

我的問題是如何解決這個問題?

如果我有一個包含許多函數的庫但它們都需要這個邏輯,那么它們應該如何使用它而不必每次都計算它?

即使他們必須這樣做,如果邏輯本身可以在整個運行時間內改變,但我只想要從函數中獲得的第一個值呢?

也許我應該澄清一下getSize中的邏輯只是一個例子,它也可能包含從特定文件中檢索文件大小的邏輯。

與C ++不同,您不能使用C中的函數結果初始化全局變量,而只能使用編譯時已知的實常數來初始化全局變量。

你需要寫:

static const int size = 50;

如果必須通過函數計算常量,則可以執行以下操作:

不要再聲明static const int size = ...了,但是寫下:

int getSize()
{
  static int initialized;
  static int size;

  if (!initialized)
  {
    size = SomeComplexFunctionOfYours();
    initialized = 1;
  }

  return size;  
}

int main(void)
{
  ...
  int somevar = getSize();
  ...

這樣, SomeComplexFunctionOfYours()只在第一次調用getSize()時被調用一次。 需要付出很小的代價:每次調用getSize() ,都需要執行測試。

或者你可以像這樣明確地初始化它,但是那時size不能再為const

static int size;

void InitializeConstants()
{
  size = SomeComplexFunctionOfYours();
}

int main(void)
{
  InitializeConstants();
  ...
  int somevar = size;
  ...

編譯器需要在編譯時知道常量變量的值,因為它是常量。

您也無法使用函數初始化變量。

你應該做這樣的事情:

#define SIZE 50

static const int size = SIZE;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM