[英]c array wrapper struct no malloc allowed
(順便說一句我不允許在這里使用malloc,我在c中寫c99)我正在嘗試在c中為數組創建一個包裝結構以保持整潔,所以我不需要繼續傳遞數組指針和周圍的長度,可以只使用一個結構:
#define MAX_LEN 64
typedef struct {
uint8_t data[MAX_LEN];
size_t len;
} byteArray_t;
如果已知MAX_LEN,那么這很好,但是有一種方法可以使長度變量雖然在編譯時已知,所以例如我可以有類似的東西:
typedef struct {
byteArray_t tag;
byteArray_t length;
byteArray_t value;
} tlv_t;
其中對應於tag
的數組的大小為MAX_TAG_LEN
,等等 - 所以我需要以某種方式告訴編譯器就是這種情況......
有人有任何想法嗎? 謝謝!
編輯
好吧,抱歉這個混亂。 這就是我想要做的。 我目前基本上有以下結構:
// tag object
typedef struct {
uint8_t data[MAX_TAG_LENGTH_IN_BYTES];
uint32_t len;
} tlvTag_t;
// length object
typedef struct {
uint8_t data[MAX_LENGTH_OF_LENGTH_IN_BYTES];
uint32_t len;
} tlvLength_t;
typedef struct tlv tlv_t;
// value object definition
typedef struct {
// can consist of a byte array, or a list of sub TLVs
union {
uint8_t data[MAX_VALUE_LENGTH_IN_BYTES];
// data can be parsed into subTLVs
tlv_t* subTLVs;
};
// need to store the number of subTLVs
uint32_t numberOfSubTLVs;
// len is the total length of the data represented:
// the total length of the subTLVs placed end to end
// or the length of the data array.
uint32_t len;
} tlvValue_t;
// tlv object definition
struct tlv {
tlvTag_t tag;
tlvLength_t len;
tlvValue_t value;
// total length of entire tlv block (not value length)
// (if there are sub TLVs, place them end to end)
uint32_t totalLen;
};
我認為如果我可以將數組包裝在另一個結構中以避免所有代碼重復並且能夠傳遞更少的參數,我認為設計會更好,但我不能因為我不知道如何告訴編譯器創建不同的大小的字節數組 - 也許可以使用宏? 希望有道理。
如果你創建一個像這樣的結構然后通過值傳遞給一個函數,那么整個數組將通過值傳遞。 你不希望出現這種情況。
實際上你不需要在struct中包含一個數組,只需在其他地方聲明它。
typedef struct {
uint8_t* data;
size_t len;
} byteArray_t;
int main()
{
uint8_t some_array[X];
...
byteArray_t wrapper = {some_array, X};
some_function (&wrapper);
}
看來你試圖以某種方式聲明一個內容依賴於參數的結構。 在c ++中,這可以通過模板實現:
template <size_t MAX_LEN>
struct byteArray_t
{
uint8_t data[MAX_LEN];
size_t len;
};
...
byteArray_t<MAX_TAG_LENGTH_IN_BYTES> tag;
byteArray_t<MAX_LENGTH_OF_LENGTH_IN_BYTES> len;
...
這很簡單。
要在C中完成相同的操作,您可以使用宏:
#define DECLARE_BYTE_ARRAY_T(your_type_name, MAX_LEN) \
typedef struct { \
uint8_t data[MAX_LEN]; \
size_t len; \
} your_type_name
DECLARE_BYTE_ARRAY_T(tlvTag_t, MAX_TAG_LENGTH_IN_BYTES);
DECLARE_BYTE_ARRAY_T(tlvLenght_t, MAX_LENGTH_OF_LENGTH_IN_BYTES);
...
tlvTag_t tag;
tlvLength_t len;
或者(相同)沒有聲明類型(如果你不需要你的結構名稱,那就好了):
#define BYTE_ARRAY_T(MAX_LEN) \
struct { \
uint8_t data[MAX_LEN]; \
size_t len; \
}
BYTE_ARRAY_T(MAX_TAG_LENGTH_IN_BYTES) tag;
BYTE_ARRAY_T(MAX_LENGTH_OF_LENGTH_IN_BYTES) len;
這可能比您已有的代碼略勝一籌。 但是,在我看來,這不值得付出努力,因為任何非平凡的宏都會降低代碼的可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.