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