2015-08-08 81 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