【问题标题】:Using macros to generalise code for function calls使用宏来概括函数调用的代码
【发布时间】:2015-03-11 08:55:35
【问题描述】:

我正在编写 C 代码,它要求我使用多个具有相同定义的函数调用,这些函数调用仅在单个字符上有所不同。有没有办法我可以制作一个宏函数,它需要一个数字,并可以将这些调用插入到我的代码中,在我调用宏的地方,因为我知道编译时的数字:

#define call_pin_macro(X)
    enable_pin#X();
    do_thing_pin#X();
    do_other_thing_pin#X();
            .
            .
void pin_function(void){
    call_pin_macro(1);
    call_pin_macro(2);
    call_pin_macro(3);
}

代替:

void pin_function(void){
     enable_pin1();
     do_thing_pin1();
     do_other_thing_pin1();
     enable_pin2();
     do_thing_pin2();
     do_other_thing_pin2();
     enable_pin3();
     do_thing_pin3();
     do_other_thing_pin3();

}

作为注释,我已经查看了 gcc 中的字符串化(因此包含 #X),但是我无法编译上面的代码,我得到一个错误“错误:'#' 后面没有宏参数”。因此,这似乎不是我所追求的功能。提前致谢。

【问题讨论】:

  • 注意:写在多行上的宏需要'\'来连接行。所以#define call_pin_macro(X)\enable_pin#X();\...

标签: c embedded c-preprocessor compile-time


【解决方案1】:

在 gcc 中你可以这样做:

#define call_pin_macro(X)   \
    enable_pin##X();           \
    do_thing_pin##X();         \
    do_other_thing_pin##X();

双重哈希是macro concatenation 运算符。您不想使用 stringify,因为它会在其周围加上引号。

反斜杠允许您在多行中继续宏。

【讨论】:

  • 双## 是否对预处理器具有类似于单个# 符号的特定(即唯一)含义,或者通过连续使用两个# 符号在此处使用其他编码直觉。
  • 它有它自己的意思:串联
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 2016-02-29
  • 2016-09-11
  • 1970-01-01
相关资源
最近更新 更多