多参数宏定义错误

时间:2015-08-08 11:39:43

标签: c++ macros

我定义了这个宏:

#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
                   ^

我做错了什么?

1 个答案:

答案 0 :(得分: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指令没有任何正式错误。另一方面,无论他们做了你想做的事我都说不出来,你应该能够说出来。