簡體   English   中英

c 中的宏數組 - 是否可能

[英]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.

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