如何在 C 中使用宏创建表达式?

Posted

技术标签:

【中文标题】如何在 C 中使用宏创建表达式?【英文标题】:How do I create an expression using macros in C? 【发布时间】:2021-12-16 14:27:18 【问题描述】:

我需要一个将输入作为输入的宏

MACRO(x, y, z, ...)

并扩展到

arr[0] == x && arr[1] == y && arr[2] == z ...

有什么想法吗?

arr 是 char[],宏 args 是单个字符

【问题讨论】:

我忘了加点....谢谢您的注意!现在它准备好了。我想用上面的宏生成一些 C 代码 我怀疑是否有一种方法可以按照您的概述进行。我假设你有一堆你想做的比较,这就是你尝试编写这个宏的原因。 arr[] 是什么类型的,你想比较什么类型的东西? 是的,你是对的,这是一个错字。我已经修好了 用于字符串比较。而且我还想学习如何使用带有自动生成索引的宏 char []中的数组 【参考方案1】:

使用 boost 预处理器:

#include <boost/preprocessor.hpp>

#define MACRO_AND(Z, N_, ARGS_)  \
    BOOST_PP_EXPR_IF(N_, &&) \
    arr[N_] == BOOST_PP_TUPLE_ELEM(N_, ARGS_)

#define MACRO(...) \
    BOOST_PP_REPEAT( \
        BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), \
        MACRO_AND, \
        (__VA_ARGS__))

这使用BOOST_PP_REPEAT 来迭代可变参数,通过 data 参数将它们作为元组输入。 BOOST_PP_EXPR_IF&amp;&amp; 作为除第 0 个参数之外的所有参数的前缀。

Boost 预处理器是一个只有头文件的库,可以与 C 一起使用。

演示(关于 coliru)here.

仅供参考,要非常小心...我不确定您将如何将其用于通用字符串输入(例如,如果在比较期间出现 NUL 终止符)。

【讨论】:

谢谢。我真的不认为这在纯 C 中是可能的。但无论如何,我会使用你的预处理器【参考方案2】:

这个怎么样:

#define MAKE_MACRO(arrname,x,y,z) (arrname)[0] == x && (arrname)[1] == y && (arrname)[2] == z
#define MACRO(arrname,x,y,z) MAKE_MACRO(arrname,x,y,z)
int main()

    char arr[3] = 'a','b','c';
    
    if (MACRO(arr,'a','b','c'))
        printf("TRUE");
    else
        printf("FALSE");
        
    return 0;

有用的参考:

Iterate through #defines Converting bool to text in C C preprocessor: expand macro in a #warning Is it possible to define same macro more than once? C pre-processor defining for generated function names https://crasseux.com/books/ctutorial/Macro-functions.html

【讨论】:

1.它是 C 而不是 C++。 2. char arr[] = 0, 'a','b','c'; if (MACRO(arr + 1,'a','b','c')) ... 会怎么样? 1. 哎呀!谢谢你的收获! @0_______ 2. 已修复(: 我有不同数量的参数,你的宏只适用于 3 个字符...

以上是关于如何在 C 中使用宏创建表达式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在C中使用宏内的switch语句?

C语言学习笔记--C语言中的宏定义

C语言中,宏替换与定义全局变量的区别是啥?

C语言中的宏定义如何使用?

如何在 Eclipse 中更改条件宏的背景颜色?

如何传递宏定义DEBUG