c - 使用 X 宏的特定条目

标签 c macros x-macros

我正在使用 X 宏来生成将 GPIO 设置为 01 的函数(我生成了大约 60 个函数来设置大约 30 个 GPIO)。这是一个例子(我刚刚写了这个例子,所以语法可能是错误的):

/* X(pin_name, pin_nb) */
#define CPLD_GPIOs \
  X(Pin0, 0) \
  X(Pin1, 1) \
  X(Pin2, 2) \
  X(Pin3, 3)

我生成了访问这些 GPIO 的函数:

#define X(pin_name, pin_nb) \
  static void SetOn_GPIO##pin_name (void) { \
    SetOn_GPIOpins(pin_nb);\
    }
    CPLD_GPIOs
#undef X

SetOff_GPIOXXX 函数存在相同的过程。

有没有一种方法可以在程序的另一部分以 SetOn_GPIOPin2 的形式访问编译器上面生成的函数,而无需直接编写函数名称? (为了让代码尽可能的全局化)

在预处理结束时,我们应该只从 X-Macro 生成 SetOn_GPIOPin2();(而不是每个 X-macro 条目)。

预处理前:

void foo ()
{
  /* some code */

  /* 
   * Macro to generate the desired function.
   * For e.g: SetOn_GPIOPin2();
   */

  /* some code */
}

预处理后:

void foo ()
{
  /* some code */

  /* Function resulting of the pre-processing */
  SetOn_GPIOPin2();

  /* some code */
}

最佳答案

从对该问题的评论来看,您的目标似乎是防止您的 X 宏被修改以生成不同名称的函数。如果是这样,那么我认为您是在为自己做不必要的工作:这些名称是否更改在您(和任何其他项目开发人员)的控制之下,并且您所关心的名称更改不会被忽视很长时间.所以不要改变它们

但如果您决定走这条路,那么不,没有办法让预处理器从宏的较大替换文本中提取由您的宏生成的函数名称。相反,您需要通过同一个宏将它们注入(inject)到 X 宏和您的其他代码中。像这样,也许:

/* X(pin_name, pin_nb) */
#define CPLD_GPIOs(gen) \
  X(Pin0, 0, gen) \
  X(Pin1, 1, gen) \
  X(Pin2, 2, gen) \
  X(Pin3, 3, gen)

// Generates the wanted function names:
#define GPIO_ON(pin_name, pin_nb) SetOn_GPIO##pin_name

#define X(pin_name, pin_nb, gen) \
  static void gen(pin_name, pin_nb) (void) { \
    SetOn_GPIOpins(pin_nb);\
    }
    CPLD_GPIOs
#undef X

// ...

void some_function(void) {
    GPIO_ON(pin_name, pin_nb)();
}

但请注意,虽然这种技术可能有其他应用,例如使用同一组 X 宏生成多组函数,但它只是在相对于您描述的具体目标。您可以依靠名称生成器宏为函数声明和函数调用生成相同的名称,但您仍然会遇到可以修改 X 宏以生成具有不同名称的函数声明的问题。

关于c - 使用 X 宏的特定条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64276598/

相关文章:

在C程序中将文件从一个文件夹复制到另一个文件夹

c++ - 在cpp中用#define定义函数?

c++ - 类 Python C++ 装饰器

c++ - 在变量宏扩展中我的逗号在哪里消失?

c - Linux设备驱动程序: Is it possible to pass a char* to unlocked_ioctl?

c - 文字常量与同值变量左移执行的差异

c - 如何用 C 语言编写我自己的 mv(重命名/移动)unix 命令版本?

c - 宏中的可变参数

连接 X 宏的多个标记

c - X 宏破坏 doxygen 调用图