2011-08-11 46 views
0

我需要聲明一個全局變量,它僅在調用某個函數時纔可用。 如果該函數未被調用,則該變量不應該可用。如何聲明只存在於一個函數中的全局變量?

void function() 
{ 
    // if this function is called then declare int a=10; 
    // as global so other function can use this 
} 

我該如何在c中做這樣的事情?

+4

你來自PHP世界嗎? ;) – ThiefMaster

+0

不,我不知道php –

回答

2

C不是一種動態語言 - 所有聲明的變量一直存在(受限於範圍規則)。

您無法測試變量是否已被聲明爲,這是編譯器作業,如果您嘗試使用不在作用域中的變量,它會給您一個錯誤。

全局當程序第一次加載時,變量會自動爲它們分配空間(在「數據」段中)。

因此,您只能測試變量是否已從其原始分配值更改。

+0

當你說'C不是動態語言'時,我沒有得到你。當然C不是像python或java腳本那樣的動態語言。但是你可以在Python中給出一個類似的例子來做與查詢中提到的相同的東西嗎? – overexchange

4

C不能像那樣工作 - 全局變量是在加載時分配的,並且在程序的整個持續時間內存在,與運行時行爲無關。如果你真的必須知道變量是否已經被「套」,您可以包括一個獨立的標誌:

int global_a; 
int global_a_has_been_set = 0; 

void f() 
{ 
    global_a = 10; 
    global_a_has_been_set = 1; 
} 

void elsewhere() 
{ 
    if (global_a_has_been_set != 0) { /* ... */ } 
} 

如果你知道你的變量只能是非負的,那麼你可以選擇使用一個特殊的標記值如-1表示該變量尚未「設置」。

最有可能的是,你應該重新設計你的設計,以便你已經通過其他方式知道你是否需要變量。

+0

對不起,我已經刪除了我的評論。我以爲OP想要不同的東西...... Kerrek SB回答完美地回答了我認爲的問題! – Veger

0

將其聲明爲全局靜態並且不初始化它。 只要調用的函數初始化函數內部

static int a; 

void main() 
{ 
    // Some code here 
} 

void function() 
{ 
    a=10; 
    // Some code here as well 

} 
+0

這不是初始化。這是任務。你爲什麼要在某些功能中「初始化」它?如果'function'沒有被調用,該對象仍然存在。 –

3

您可以定義一個static變量函數內部,那麼它只是在該函數可用(並保持多間公司價值電話):

int increment() { 
    static int x = 0; // Initialize with 0 
    x++; 
    return x; 
} 

void main() { 
    printf("%d\n", increment()); 
    printf("%d\n", increment()); 
    printf("%d\n", increment()); 

    // (unfortunately) x is not available here... 
} 

Returns: 
1 
2 
3 

每次increment()函數被調用時,它會返回一個較大的數字。

無法使用超出範圍的變量。所以你可以在'全局範圍'中定義一個變量(如Kerrek SB所示)或函數(或任何其他範圍)中的靜態變量(如上所示)。如果任何這些可能性不適用於您的情況,恐怕您應該(徹底)修改您的應用程序的結構...

+0

現在x不是全局變量的靜態局部變量。 –

+1

只能在一個函數中使用的全局變量_is_類型的靜態局部變量,對嗎? – Veger

+0

@Veger:提問者並沒有說他們只希望它在該函數中可用,而應該只在該函數被調用後纔可用。沒有具體說明誰在使用它,「全球」暗示我「任何人都可以」,所以當然這個提問者描述的東西在C中是不存在的。 –

0

建議避免使用全局變量儘可能。 你的具體情況,你可以做的是簡單的:

function(int* toModify) 
{ 
    *toModify = 10; 
    // do sth 
} 

現在你的其他功能可以使用修改後的值。

但是,如果你是熱衷於使用全局變量,你必須使用兩個全局變量,

int gIsFuncCalled = 0; 
int gToModify = 0; 

void function() 
{ 
    gIsFuncCalled = 1; 
    gToModify = 10; 
} 

現在你可以使用gToModify有條件使用gIsFuncCalled

1

無法將全局變量的範圍限制爲文件中的一個函數,它可用於文件中的所有函數,但您可以通過使用static關鍵字將全局變量的範圍限制爲文件與全局變量名稱。

file1.c //1st file      file2.h //2nd file 

    #include<file2.h>      
    main()        static int a; 
    { 
    fun();         fun() 
    }          { 
              printf("%d",a); 
              } 

在這個例子中你有兩個名爲file1.c和file2.h,現在變量是僅在第一檔到函數fun()。