簡體   English   中英

在C結構中的Typedef

[英]Typedef inside a C struct

首先關閉令我難以置信的代碼:

typedef struct Object {
    typedef int MyInt;
    void (*destructor)(Object *);
    void *(*constructor)(struct Object *);
} Object;

為什么編譯器阻止我在struct中定義typedef?

這是不允許的。 C ++類中允許類似的東西,但在標准C中不允許。

在C語言中, struct每個聲明都必須聲明一個數據字段(可能是未命名的)。 這意味着可以在C中定義struct內部的類型,只要新類型聲明作為數據字段聲明的一部分嵌入即可。 例如

struct Outer {
  struct Inner {
    int i;
  } field;
};

struct Outer a;
a.field.i = 42;

在上面的示例中,類型struct Innerstruct Outer類型中聲明。 但是,“嵌套” struct Inner類型聲明在struct Outer沒有任何本地化。 它仍然具有文件范圍,因為C語言沒有struct范圍這樣的東西。 這意味着您仍然可以使用struct Inner作為同一文件范圍的成員

struct Inner b;
b.i = 42;

同時,這個技巧不適用於typedef聲明,因為typedef聲明不聲明數據字段。

請注意,本着C語言的精神,即使你的typedef聲明在某種程度上是合法的,它仍然會聲明一個帶有文件范圍的typedef名稱MojInt 即它的行為與在struct之前放置typedef聲明的行為完全相同。

不知道它是在C ++中被允許的,但我可以肯定地說我沒有看到沒有vanilla C編譯器接受該構造。

這是一個可瀏覽的C99語法,可能有望清除混淆: http//slps.github.io/zoo/c/iso-9899-tc3.html

檢查1998 C ++語法進行比較: http//slps.github.io/zoo/cpp/iso-14882-1998.html

暫無
暫無

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

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