在另一个宏内展开X宏

gil_bz

我有一个使用来打印输出的函数fprintf(),并且它同时使用宏作为格式字符串和参数。由于有多个地方可以打印此信息,因此可以在仅更改一个地方的同时扩展打印范围。

我想使用相同的数据生成不同的打印,但是我希望它们使用X宏自动一起扩展,但是我无法编译它。我不希望每次添加打印内容时都需要编辑打印内容,或将每个打印内容包装在ug中#define

该程序尝试执行我想要的操作,但无法编译:

#include <stdio.h>

#define X(_a, _b, _c) \
    _a,

#define TABLE \
    X("abc", "123", "ddd") \
    X("def", "456", "aaa") \
    X("ghi", "789", "ddd") \
    
#define STUFF \
    TABLE

#undef X
    
int main()
{
    printf(" %s %s %s\n", STUFF);

    return 0;
}

(想法是STUFF打印一件事,而在另一地方,我将使用X宏的另一列TABLE创建STUFF2)

我收到以下错误:

main.c:在函数“ main”中:

main.c:7:5:警告:函数'X'的隐式声明[-Wimplicit-function-declaration]

X("abc", "123", "ddd") \

^

main.c:12:5:注意:在宏“ TABLE”的扩展中

TABLE

^~~~~

main.c:18:27:注意:在宏'STUFF'的扩展中

printf(" %s %s %s\n", STUFF);

                      ^~~~~

main.c:8:5:错误:'X'之前的预期')'

X("def", "456", "aaa") \

^
约翰·布林格

main.c:7:5:警告:函数'X'的隐式声明[-Wimplicit-function-declaration]

嗯,是。STUFF出现宏的第18行,首先将其扩展为

TABLE

,然后重新扫描。TABLE被定义为宏,它也被扩展,导致

X("abc", "123", "ddd") X("def", "456", "aaa") X("ghi", "789", "ddd")

,那么重新扫描。X没有定义为在该点的宏(或其他东西),因为你以前undefINED它。剩下的代码类似于对未知函数的三个调用,而没有任何类型的运算符或分隔符。无效。

您的X宏必须在展开位置适当定义。完全不需要在另一个宏的扩展文本中出现的位置对其进行定义。您似乎倒退了。


正如评论中所讨论的那样,目标是能够定义单独的宏,例如STUFFSTUFF2它们可以扩展TABLE为彼此不同的一致结果。这与STUFF通过操纵的定义引起所需的扩展相反X

这可以通过更改的定义来实现,TABLE以便使它成为类似于函数的宏,并以另一个宏名称作为参数:

#define TABLE(m) \
    m("abc", "123", "ddd") \
    m("def", "456", "aaa") \
    m("ghi", "789", "ddd")

STUFFSTUFF2然后可以控制他们所选择的哪个宏名称来传递到膨胀TABLE()

#define X(_a, _b, _c) _a
#define Y(_a, _b, _c) _b
#define STUFF TABLE(X)
#define STUFF2 TABLE(Y)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

(C99)在另一个宏中展开一个宏

来自分类Dev

C 宏在另一个 C 宏中展开

来自分类Dev

GCC宏扩展以调用另一个宏

来自分类Dev

无法从另一个调用#define宏

来自分类Dev

从另一个工作簿运行宏

来自分类Dev

VBA宏跳到另一个吗?

来自分类Dev

Excel:在KeyUp上运行另一个宏

来自分类Dev

从C ++中的另一个宏调用多个宏

来自分类Dev

Clojure宏在另一个宏中:如何从符号生成字符串

来自分类Dev

C可变参数宏调用另一个可变参数宏

来自分类Dev

如何在调用另一个宏时使用宏参数?

来自分类Dev

当子类未使用另一个宏时,C ++宏将失败

来自分类Dev

如何使用从另一个宏中的宏变量返回的值

来自分类Dev

使用sendKeys函数停止使用另一个宏(按钮)的宏执行

来自分类Dev

Excel VBA onkey宏在另一个宏运行时可以正常工作

来自分类Dev

在guile方案中,如何从另一个宏调用宏时防止重命名?

来自分类Dev

如何定义使用另一个宏的C宏?

来自分类Dev

另一个宏中的Q_PROPERTY宏

来自分类Dev

宏中的逗号以将参数传递给另一个宏函数(#define a,b)

来自分类Dev

宏名称从makefile中的另一个宏扩展

来自分类Dev

C可变参数宏调用另一个可变参数宏

来自分类Dev

如何使用从另一个宏中的宏变量返回的值

来自分类Dev

如何检查宏的元素是否在另一个宏中

来自分类Dev

在另一个宏的字符串参数中使用Freemarker宏调用

来自分类Dev

如何使用另一个宏创建 C 宏名称?

来自分类Dev

GCC 预编译器宏 ## ,与另一个宏的标记连接

来自分类Dev

NASM - 宏本地标签作为另一个宏的参数

来自分类Dev

在将宏作为参数传递给另一个宏之前按值翻译宏

来自分类Dev

如何创建一个 Excel 宏来停止另一个宏并重新调用它?

Related 相关文章

  1. 1

    (C99)在另一个宏中展开一个宏

  2. 2

    C 宏在另一个 C 宏中展开

  3. 3

    GCC宏扩展以调用另一个宏

  4. 4

    无法从另一个调用#define宏

  5. 5

    从另一个工作簿运行宏

  6. 6

    VBA宏跳到另一个吗?

  7. 7

    Excel:在KeyUp上运行另一个宏

  8. 8

    从C ++中的另一个宏调用多个宏

  9. 9

    Clojure宏在另一个宏中:如何从符号生成字符串

  10. 10

    C可变参数宏调用另一个可变参数宏

  11. 11

    如何在调用另一个宏时使用宏参数?

  12. 12

    当子类未使用另一个宏时,C ++宏将失败

  13. 13

    如何使用从另一个宏中的宏变量返回的值

  14. 14

    使用sendKeys函数停止使用另一个宏(按钮)的宏执行

  15. 15

    Excel VBA onkey宏在另一个宏运行时可以正常工作

  16. 16

    在guile方案中,如何从另一个宏调用宏时防止重命名?

  17. 17

    如何定义使用另一个宏的C宏?

  18. 18

    另一个宏中的Q_PROPERTY宏

  19. 19

    宏中的逗号以将参数传递给另一个宏函数(#define a,b)

  20. 20

    宏名称从makefile中的另一个宏扩展

  21. 21

    C可变参数宏调用另一个可变参数宏

  22. 22

    如何使用从另一个宏中的宏变量返回的值

  23. 23

    如何检查宏的元素是否在另一个宏中

  24. 24

    在另一个宏的字符串参数中使用Freemarker宏调用

  25. 25

    如何使用另一个宏创建 C 宏名称?

  26. 26

    GCC 预编译器宏 ## ,与另一个宏的标记连接

  27. 27

    NASM - 宏本地标签作为另一个宏的参数

  28. 28

    在将宏作为参数传递给另一个宏之前按值翻译宏

  29. 29

    如何创建一个 Excel 宏来停止另一个宏并重新调用它?

热门标签

归档