我正在尝试简化在C中编写嵌入式程序。如何创建一个可以接受2个以上任何数字或参数的宏?
我目前有这个:
#define P_PIN_HIGH(pin_letter, pin_num) (PORT##pin_letter |= (1 << pin_num))
#define PIN_HIGH(...) P_PIN_HIGH(__VA_ARGS__)
我可以这样使用:
#define PIN_TEST A, 0 // Every pin gets defined this way.
PIN_HIGH(PIN_TEST); // Set this pin to high.
但是,我希望能够将任意数量的引脚(它们必须具有相同的字母)传递给宏,如下所示:
#define PIN_TEST A, 0
#define PIN_TEST1 A, 1
#define PIN_TEST2 A, 2
PIN_HIGH(PIN_TEST, PIN_TEST1, PIN_TEST2);
因此,编译后的代码如下所示:
PORTA |= ((1<<0) | (1<<1) | (1<<2));
这可行吗?
答案 0 :(得分:1)
不是真的。如果您可以使用c ++,那么使用模板非常容易。
template <volatile char *port_, size_t bit_number_>
struct port_descriptor
{
static constexpr size_t bit_number = bit_number_;
static volatile char *const port;
};
template <volatile char *port_, size_t bit_number_>
volatile char *const port_descriptor<port_, bit_number_>::port = port_;
typedef port_descriptor<&PORTA, 0> PIN_TEST;
template <class ...args>
char get_set_port_value(bool new_value);
template <class ...args>
void set_port_value(bool new_value);
template <volatile char *port_, size_t bit_number_>
char get_set_port_value<port_descriptor<port_, bit_number_>>(bool new_value)
{
char v = *port_;
if(new_value)
return v | 1 << bit_number_;
return v & ~(1 << bit_number_);
}
template <volatile char *port_, size_t bit_number_, class ...Args>
char get_set_port_value<port_descriptor<port_, bit_number_>, Args...>(bool new_value)
{
char v = get_set_port_value<Args...>();
if(new_value)
return v | 1 << bit_number_;
return v & ~(1 << bit_number_);
}
template <volatile char *port_, size_t bit_number_, class ...Args>
void set_port_value<port_descriptor<port_, bit_number_>, Args...>(bool new_value)
{
char v = get_set_port_value<port_descriptor<port_, bit_number_>, Args...>(new_value);
*port_ = v;
}
然后你可以set_port_value<PIN_TEST>(true);
答案 1 :(得分:0)
你的P_PIN_HIGH()宏似乎只有两个参数。在你的variadic macro PIN_HIGH中,你传递了3个参数对,根据该宏的定义,它们将作为参数传递给P_PIN_HIGH(它只需要2个参数)。看起来你想通过显式传递参数对的数量来迭代P_PIN_HIGH()宏中的参数对。