簡體   English   中英

是否允許結構的成員是靜態的?

[英]Are members of a structure allowed to be static ?

#include<stdio.h>
struct str 
{ 
   static int a ;
    int b ;
 } s ;
int main()
{
static int p , k ;
printf("%d %d",sizeof(p),sizeof(s));
getchar();
return 0;
}

上面的代碼給出了錯誤。 但是,如果我將結構的第一個成員重新定義為'int'而不是'static int',則它可以正常運行。 為什么在結構中不允許使用靜態成員,其意義是什么?

C語言根本沒有這樣的功能。 而且,C中沒有針對此類功能的有意義的概念框架。

您可以看到,用C ++術語來說, static成員變量和普通全局變量之間只有一個相關的區別:聲明其名稱的范圍和相應的命名語法。 全局變量可以稱為a ,而類的靜態成員稱為SomeClass::a 除了作用域命名之外,沒有其他區別。 (我故意忽略其他特定於C ++的功能,例如訪問控制,因為它們不存在於C中,並且這個問題確實與C有關。)

在C語言中,結構類型不會引入自己的范圍。 C語言中沒有諸如SomeStruct::a這樣的命名語法。 因此,根本沒有理由在結構中包含靜態成員。 您可以改為聲明全局變量並獲得相同的效果。 調用全局變量str_a來傳達將其與struct str “關聯”的意圖,並僅將該變量視為struct str的偽靜態成員。

從形式上來講,可以在C ++中實現相同的功能,即完全忽略C ++語言的這一功能,並使用全局函數和變量而不是類中的靜態函數和變量。 但是,這樣做將放棄C ++的所有成員訪問控制功能。 這些功能確實值得擁有。 C語言沒有訪問控制功能,這意味着C語言幾乎不會丟失任何東西。

語言只是不允許。 除了它不是設計的一部分之外,沒有其他更深層次的原因。 您始終可以使用單獨的全局變量來實現相同的行為,如下所示:

struct str
{
    int b;
} s;

int str_a;

注意,擁有一個靜態的int a;將會完全不同int a; 在您的struct內部,這將是struct str類型的每個對象的唯一子元素。

(還請注意,在C ++中,一種從C演變而來的語言,確實存在靜態類成員,並且其行為與我上述的解決方法完全相同,只是全局變量的名稱與類的名稱緊密相關。)

靜態修飾符是在文件的全局范圍內聲明變量,而函數中的靜態修飾符會創建一個變量,其持久性值限於此函數的范圍。 而且,您不能在結構實例之間共享此整數的值。 這不是,也不能在C中支持;)

為什么要在結構中使用靜態成員? 也許(必須)有更好的解決方案。

不,不是在C中。我相信C ++可以做到這一點,這意味着在struct str結構的所有實例之間共享a 一個副本。

如果您想在C語言中執行類似的操作,則有幾種選擇(可能還有更多選擇,我暫時無法想到它們)。

首先是使用類似以下內容的通用變量:

int struct_str_static_a;
struct str {
    int b;
} s;

這樣一來,只有一個拷貝a通過結構的所有實例共享-每個實例仍然得到了自己的副本b

對它的一個小修改是引入一個指向該公共變量的指針並初始化該指針:

int struct_str_static_a;
struct str {
    int *pA;
    int b;
} s;
:
s.pA = &struct_str_static_a;

然后,可以在使用sa之前使用*(s.pA) 因為struct str每個實例都有其自己的pA指針,該指針指向單個a ,所以可以得到類似的效果。 但是,這是一條曲折的道路。

第三種選擇是讓自己進入下一個ISO C工作組,並將其作為對語言的更改提出。 但是,在接下來的十年左右的時間里,這需要您付出相當大的努力,可能不值得付出努力:-)

您在這里有很好的答案: http : //cboard.cprogramming.com/c-programming/123691-static-variable-structure.html

一般而言,將其聲明為靜態沒有任何好處,但是如果您仍然希望將其聲明為靜態,則可以遷移到c ++或將整個結構聲明為靜態。

暫無
暫無

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

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