[英]Array of macros in c — is it possible
我想知道是否有可能創建類似宏數組的東西。 我已經實現了以下有效的代碼:
struct led_cmds_
{
ioport_pin_t *commands[LED_COUNT] ;
};
struct led_cmds_ the_led_cmd_ ;
void populate() {
the_led_cmd_.commands[0] = SPECIFICPIN(0);
}
主要是:
int main(void)
{
//.....
populate();
LED_On(the_led_cmd_.commands[0]);
}
SPECIFICPIN(x)
是宏定義為:
#define SPECIFICPIN(X) (LED##X##_PIN)
我希望的是一種方法來做這樣的事情:
#define ioport_pin_t* ARR_LED[LED_COUNT] \
for (int j = 0; j < LED_COUNT; j++) ARR_LED[j] = SPECIFICPIN(j);
然后只需要在我想使用特定引腳時調用以下
LED_On(ARR_LED[some_number])
當我嘗試這樣做時,我收到了 ARR_LED 未聲明(首次在此函數中使用)錯誤。
例如,當我嘗試調用SPECIFICPIN(x)
,其中 x 是 for 循環中的 int 迭代器,我收到一條錯誤消息,說“LEDx_PIN”未聲明...
你需要研究你的術語。 宏數組是不可能的。 宏不是數據類型,而是在實際編譯程序之前進行純文本替換。
我想“使用宏填充數組”是您想要做的。 但是,這是不可能做到這一點的編譯時間回路-你好像有什么想實現你的ioport_pin_t
宏嘗試。 宏不能擴展到比您最初給出的更多的文本元素實例。 沒有通過宏擴展在編譯時循環和對宏進行重復擴展這樣的功能。
您的for
循環在運行時循環,而宏在編譯時被擴展。 一旦你了解了預處理器做了什么,編譯器做了什么,以及完成的程序在運行時做了什么,你就會發現這將不起作用。
類似的東西
#define P(X) {(LED##X##_PIN)}
ioport_pin_t *commands[LED_COUNT] = {
P(0), P(1), P(2),......}
#undefine P
將是最接近您似乎想要的東西。 請注意,預處理器的主要用途不是為了節省您的打字工作量 - 您最好在編輯器中使用復制和粘貼,實現相同的目標並擁有更清晰的代碼。
一個數組作為 tofro 的答案是要走的路。 但是,如果不能簡單地用數組解決,那么還有另一種方式與 switch
#define SPECIFICPIN(X) (LED##X##_PIN)
void setpin(int pin, int value)
{
switch (pin)
{
case 1:
SPECIFICPIN(1) = value;
doSomething(); // if needed
break;
case x: ...
default: ...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.