簡體   English   中英

關於C vrs C ++中的結構變量聲明

[英]Regarding struct variable declaration in C vrs C++

在C

   struct node {
          int x;
   };

   node *y; // incorrect
   struct node *y; // correct  

在C ++中

   struct node{
         int x;
   };

   node *y; // correct
   y = new node; // correct

問題:為什么在C ++中不能在C中創建指針,但可接受標簽名稱?

因為C ++標准如此,而C標准卻沒有。

我要說的是C ++進行了更改,使類更易於使用(請記住,類和結構在C ++中本質上是同一件事;它們在默認可見性上是不同的),而C並沒有效仿,因為這會破壞大量現有的C代碼。

原因不只是因為該標准這樣說,C ++實際上具有名稱空間,struct關鍵字允許C語言中的名稱空間為原始形式,它允許您具有相同名稱的struct和non-struct標識符。 我們可以從C99草案標准第6.2.3“標識符的命名空間”中看到這種命名空間的原始形式,其中表示:

如果在翻譯單元的任何位置都可以看到一個以上的特定標識符聲明,則語法上下文會消除指向不同實體的用法的歧義。 因此,對於各種類別的標識符,存在單獨的名稱空間,如下所示:

並具有以下項目符號:

—標簽名稱(由標簽聲明和使用的語法消除);

—關鍵字struct,union或enum的結構,聯合和枚舉的標簽(通過遵循any24消除歧義);

—機構或工會的成員; 每個結構或聯合為其成員都有一個單獨的名稱空間(通過用於通過。或->運算符訪問成員的表達式的類型來消除歧義);

—所有其他標識符,稱為普通標識符(在普通聲明符中聲明或作為枚舉常量聲明)。

我可以組成一個示例,但是POSIX通過stat給出了一個很好的示例,它既是函數又是結構

int stat(const char *restrict path, struct stat *restrict buf);
    ^^^^                            ^^^^^^^^^^^

如果要在C中編寫node * y的方式,只需

typedef struct node {
    int x;
} node;

暫無
暫無

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

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