c - 宏中的多个参数

标签 c macros

我正在尝试简化用 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));

这可行吗?

最佳答案

不是真的。如果您会使用 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);

关于c - 宏中的多个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25690186/

相关文章:

c - 如何使用 time.h 将旧年份转换为现在的秒数(我开始得到负数)

c++ - Cudd:提取变量排序

c - 编写一个宏来读取不同数据类型的变量

c - Windows 上的 limits_h 宏 (C)

c++ - 宏中的 typedef 字符

c - 使用 C 访问 GSL 库

返回 char 指针的 C 函数在 "Debug"模式下给出垃圾,但在 "Release"模式下没有

c - 如何在 C 中返回十六进制字符串?

url - 如何从 txt 文件和使用 imacro 加载 url

c++ - 如何避免与 Windows 头文件中定义的宏发生名称冲突?