struct用法 - typedef用法




typedef固定長度數組 (4)

我必須定義一個24位數據類型。我使用char[3]來表示類型。 我可以typedef char[3]type24嗎? 我在代碼示例中嘗試了它。 我把typedef char[3] type24; 在我的頭文件中。 編譯器沒有抱怨。 但是當我在C文件中定義了一個函數void foo(type24 val) {}時,它確實抱怨了。 我想能夠定義類型type24_to_int32(type24 val)而不是type24_to_int32(char value[3])


typedef是

typedef char type24[3];

然而,這可能是一個非常糟糕的想法,因為結果類型是一個數組類型,但它的用戶不會看到它是一個數組類型。 如果用作函數參數,它將通過引用傳遞,而不是通過值傳遞,並且sizeof會因此而出錯。

更好的解決方案是

typedef struct type24 { char x[3]; } type24;

您可能也想使用unsigned char而不是char ,因為後者俱有實現定義的簽名。


你要

typedef char type24[3];

C類型的聲明很奇怪。 如果您聲明了該類型的變量,則將該類型準確放置在變量名稱所在的位置。


數組中的值不能作為函數參數傳遞

你可以把數組放在一個struct中:

typedef struct type24 {
    char byte[3];
} type24;

然後通過值傳遞它,但當然,使用它不太方便: x.byte[0]而不是x[0]

你的函數type24_to_int32(char value[3])實際上是按指針傳遞的,而不是按值。 它與type24_to_int32(char *value)完全等價,並且3被忽略。

如果你很高興通過指針傳遞,你可以堅持使用數組,然後執行:

type24_to_int32(const type24 *value);

這將傳遞一個指向數組的指針,而不是指向第一個元素,所以你使用它作為:

(*value)[0]

我不確定這真的是一個收穫,因為如果你不小心寫了value[1]那麼會發生一些愚蠢的事情。


要正確使用數組類型作為函數參數或模板參數,請創建一個結構而不是typedef,然後向結構中添加一個operator[] ,以便可以像這樣保持數組的功能:

typedef struct type24 {
  char& operator[](int i) { return byte[i]; }
  char byte[3];
} type24;

type24 x;
x[2] = 'r';
char c = x[2];




typedef