簡體   English   中英

在C ++中聲明結構時使用typedef

[英]using typedef in declaring structs in C++

我個人不喜歡那種舊的C風格的結構聲明:

typedef struct {} NewType;

ctags使得丑陋的anon類型變得困難並使調試變得困難。 C ++代碼中是否有任何理由使用typedef結構而不是簡單的struct,除了代碼在C和C ++中使用?

此致,Valentin

這是一個C-ism 在C中,結構和枚舉實際上有一個名稱空間,因此

struct NewType {};
enum SomeEnum {};

你必須編寫struct NewTypeenum SomeEnum來引用。

在C ++中,這不是必需的。 所以,除非你編寫一個需要由C編譯器解析的頭文件,否則你不應該使用它。

這些的一個主要缺點

typedef struct tagSomethingSomething SomethingSomething;

就是說,使用常用的typedef'fed名稱無法進行前向聲明。

是的,這是一個C-ism (kudos sbi)並且有c ++ - 代碼庫,不幸的是 - 它仍然很常見。

@sbi:我認為不是:可能是錯的,但是......在C ++中它不是一個匿名結構,有一個特殊的規則稱為“struct hack”,它使用typedef名稱標記一個普通的struct,因此typedef名稱變為班級名稱也是如此。 這是必需的,因為具有外部鏈接的函數需要類類型的參數也具有外部鏈接,這意味着具有外部名稱。 沒有這個hack,只有extern“C”函數可以操作結構。

你可以使用匿名結構的唯一地方是在另一個結構中:

struct X { struct {int a; } b; } x;
x.b.a; // OK

即使b的類型是匿名的,struct X也有外部鏈接。 匿名結構可以在堆棧或靜態存儲中使用,但與匿名聯合不同,它不會提供優於單獨變量的優勢。 我甚至不確定C ++是否允許匿名結構。

暫無
暫無

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

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