2015-08-08 77 views
0

我定義這個宏:多方論證宏定義錯誤

#define DEF_CONCAT(a, b)  a ## b 
#define _internal_RCC(gpio, io) DEF_CONCAT(RCC_GPIO, gpio) 
#define _internal_IO(gpio, io) DEF_CONCAT(GPIO, io) 

#define IO_CFG_OUTPUT(gpio) {rcc_periph_clock_enable(_internal_RCC(gpio));gpio_set_mode(gpio, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, _internal_IO(gpio));} 

而且我想調用這個:

IO_CFG_OUTPUT(LED_STATE);

LED_STATE被定義爲:#define LED_STATE C,12

但是,當我運行我的程序,編譯器告訴我:

In file included from inc/Robot.hpp:6:0, 
       from src/Robot.cpp:1: 
src/Robot.cpp: In member function 'void Robot::setup()': 
inc/IODefines.hpp:13:19: error: 'C' was not declared in this scope 
#define LED_STATE C,12 
       ^

我做錯了什麼?來源

+0

'#define LED_STATE C,12'這似乎是錯誤的,你打算做什麼? –

+0

是的,但是爲什麼?它應該使用C作爲字母在IO_CFG_OUTPUT中通過DEF_CONCAT將它結合到RCC_GPIOC中。怎麼樣? –

+1

你也可以在'gpio_set_mode(gpio,..)'中使用它,'C'是否存在? gpio_set_mode是一個宏嗎? – Jarod42

回答

2

運行gcc -E看到你的宏擴展爲...

它所擴展到爲{rcc_periph_clock_enable(RCC_GPIOC);gpio_set_mode(C,12, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO12);};。或更可讀的格式:

{ 
    rcc_periph_clock_enable(RCC_GPIOC); 
    gpio_set_mode(C,12, 
        GPIO_MODE_OUTPUT_50_MHZ, 
        GPIO_CNF_OUTPUT_PUSHPULL, 
        GPIO12); 
}; 

注意把一個分號}後的可疑做法,它可能會導致令人驚訝的行爲。正常擴展到正常工作的複合語句的方法是使用do { body; } while(0)

問題是C沒有在任何地方定義。

雖然錯誤消息看起來有點混亂。你的define指令沒有任何形式上的錯誤。另一方面,無論他們做了你想做的事情,我都無法說清楚,你應該能夠說清楚。

+0

絕對不是解決方案,順便說一句,你應該閱讀評論。它已經解決了。錯誤是我在gpio_set_mode中使用gpio而不是_internal _... –

+0

也許不是你問題的解決方案,但我認爲它是對實際問題的答案(即「我做錯了什麼」)。從地獄中不可能從這個問題中得知它應該是*內部的*。 – skyking