我需要聲明一個全局變量,它僅在調用某個函數時纔可用。 如果該函數未被調用,則該變量不應該可用。如何聲明只存在於一個函數中的全局變量?
void function()
{
// if this function is called then declare int a=10;
// as global so other function can use this
}
我該如何在c中做這樣的事情?
我需要聲明一個全局變量,它僅在調用某個函數時纔可用。 如果該函數未被調用,則該變量不應該可用。如何聲明只存在於一個函數中的全局變量?
void function()
{
// if this function is called then declare int a=10;
// as global so other function can use this
}
我該如何在c中做這樣的事情?
C不是一種動態語言 - 所有聲明的變量一直存在(受限於範圍規則)。
您無法測試變量是否已被聲明爲,這是編譯器作業,如果您嘗試使用不在作用域中的變量,它會給您一個錯誤。
全局當程序第一次加載時,變量會自動爲它們分配空間(在「數據」段中)。
因此,您只能測試變量是否已從其原始分配值更改。
當你說'C不是動態語言'時,我沒有得到你。當然C不是像python或java腳本那樣的動態語言。但是你可以在Python中給出一個類似的例子來做與查詢中提到的相同的東西嗎? – overexchange
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
表示該變量尚未「設置」。
最有可能的是,你應該重新設計你的設計,以便你已經通過其他方式知道你是否需要變量。
對不起,我已經刪除了我的評論。我以爲OP想要不同的東西...... Kerrek SB回答完美地回答了我認爲的問題! – Veger
將其聲明爲全局靜態並且不初始化它。 只要調用的函數初始化函數內部
即
static int a;
void main()
{
// Some code here
}
void function()
{
a=10;
// Some code here as well
}
這不是初始化。這是任務。你爲什麼要在某些功能中「初始化」它?如果'function'沒有被調用,該對象仍然存在。 –
您可以定義一個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所示)或函數(或任何其他範圍)中的靜態變量(如上所示)。如果任何這些可能性不適用於您的情況,恐怕您應該(徹底)修改您的應用程序的結構...
現在x不是全局變量的靜態局部變量。 –
只能在一個函數中使用的全局變量_is_類型的靜態局部變量,對嗎? – Veger
@Veger:提問者並沒有說他們只希望它在該函數中可用,而應該只在該函數被調用後纔可用。沒有具體說明誰在使用它,「全球」暗示我「任何人都可以」,所以當然這個提問者描述的東西在C中是不存在的。 –
建議避免使用全局變量儘可能。 你的具體情況,你可以做的是簡單的:
function(int* toModify)
{
*toModify = 10;
// do sth
}
現在你的其他功能可以使用修改後的值。
但是,如果你是熱衷於使用全局變量,你必須使用兩個全局變量,
int gIsFuncCalled = 0;
int gToModify = 0;
void function()
{
gIsFuncCalled = 1;
gToModify = 10;
}
現在你可以使用gToModify
有條件使用gIsFuncCalled
無法將全局變量的範圍限制爲文件中的一個函數,它可用於文件中的所有函數,但您可以通過使用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()。
你來自PHP世界嗎? ;) – ThiefMaster
不,我不知道php –