簡體   English   中英

宏以在C中設置靜態分配的結構

[英]Macro to set up statically allocated struct in C

我有以下C代碼,這些代碼創建描述FIFO的結構,並分別定義一個數組來保存該FIFO的實際數據。 這是我正在編寫的基本I2C / TWI驅動程序的一部分,最好是更簡潔地執行此操作,例如使用以大小為參數的函數。

    twi_fifo_t fifo;
    twi_entry_t fifodata[64];

    fifo.push = 0;
    fifo.pull = 0;
    fifo.next_cmd = 0;
    fifo.size_mask = ~(0xFFFF<<6);
    fifo.data = fifodata;

但是,我希望這些是靜態分配的,因為沒有可預見的原因在運行時創建,銷毀或更改它們。

我的理解是,如果我在一個函數中創建了FIFO和數據數組,我將需要使用malloc()來分配它們,因為它們的位置無法在編譯時確定。 這似乎需要一個宏,它會導致第二段代碼。

#define twi_make_fifo(name, size)\
    twi_fifo_t name;\
    twi_entry_t name##_data[1<<size];\
    name.push = 0;\
    name.pull = 0;\
    name.next_cmd = 0;\
    name.size_mask = ~(0xFFFF<<size);\
    name.data = name##_data;

宏解決方案似乎有點令人討厭,是否有一些明顯的方法可以簡化我忘記的操作?

如果您的FIFO具有不同的名稱和大小,並且如果您希望避免使用單獨的顯式代碼來聲明和初始化每個數據結構的數據,則只有兩種選擇:寫一個可重用的函數來完成這項工作(這需要執行動態分配,並因此有義務向調用方釋放),或編寫類似函數的可重用宏。

宏解決方案似乎有點令人討厭,是否有一些明顯的方法可以簡化我忘記的操作?

如果無法實現動態分配,則使用宏來實現目標似乎是唯一的方法。 但是宏可以通過提供結構的初始化程序而不是一系列成員分配語句來針對更干凈的代碼。 您可以在任何標准C版本中執行此操作,但是如果您可以依賴於C99中引入的指定的初始化程序,那就更好了:

#define twi_make_fifo(name, size)\
    twi_entry_t name##_data[1<<size];\
    twi_fifo_t name = { .size_mask = ~(0xFFFF<<size), .data = name##_data };

請注意,我在那里依賴以下事實:如果您為結構提供了初始化程序,則所有未顯式初始化的成員都將初始化為0 / NULL。 還請注意,您當然也可以直接使用相同的表單,而無需宏。

如果可以為每個FIFO提供明確的代碼,但是您只想避免手動編寫每個集合,那么您可以編寫自己的代碼生成器來(重新)生成它們的代碼,但是我傾向於認為那可能是麻煩多於其所值。

暫無
暫無

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

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