我感到困惑的全局和靜態全局變量之間的差異。如果靜態意味着這個變量只對同一個文件是全局的,那麼爲什麼在兩個不同的文件中有相同的名稱會導致名稱衝突?
有人可以解釋這一點嗎?
我感到困惑的全局和靜態全局變量之間的差異。如果靜態意味着這個變量只對同一個文件是全局的,那麼爲什麼在兩個不同的文件中有相同的名稱會導致名稱衝突?
有人可以解釋這一點嗎?
當您創建鏈接器可用的.o
文件以在其他文件中使用時,全局變量(不是static
)在那裏。因此,如果你有兩個文件就是這樣,你的名字碰撞上a
:
交流:
#include <stdio.h>
int a;
int compute(void);
int main()
{
a = 1;
printf("%d %d\n", a, compute());
return 0;
}
BC:
int a;
int compute(void)
{
a = 0;
return a;
}
因爲鏈接不知道哪個全局的a
s使用。
但是,當您定義靜態全局變量時,您告訴編譯器只爲該文件保留變量,並且不要讓鏈接器知道它。所以,如果你(在a
定義)添加static
我寫這兩個示例代碼,你不會得到名稱衝突只是因爲鏈接甚至不知道有處於或者文件的a
:
AC:
#include <stdio.h>
static int a;
int compute(void);
int main()
{
a = 1;
printf("%d %d\n", a, compute());
return 0;
}
BC:
static int a;
int compute(void)
{
a = 0;
return a;
}
這意味着,每個文件的工作與自己的a
在不知道其他的。
作爲一個側面說明,它的確定有他們static
之一,其他沒有限制,只要它們是在不同的文件。如果兩個聲明在同一個文件中(請參閱轉換單元),一個static
和一個extern
,請參閱this answer。
在每個文件中靜態名稱應爲而不是會導致名稱衝突。如果你看到這些,請發佈(簡短)演示代碼,以及你正在使用的確切編譯器,以便我們可以正確驗證代碼並假設它是正確的,從而適當地詆譭編譯器。
只是FWIW,在C++的首選方法是使用,而不是一個匿名的命名空間:
namespace {
int not_a_static_variable;
}
實話實說,不,我不能指向很多客觀的優勢,雖然...
發佈代碼... – Nawaz
你有例子嗎? – glglgl
如果兩個變量在不同的文件中被聲明爲靜態,它不應該導致名稱衝突。我只是執行了一個快速測試,並按預期工作。如果它不適合你,請將代碼發佈到不能按預期工作的位置,期望的內容以及獲得的內容以及使用的編譯器。 – Kevin