【问题标题】:How do I create an expression using macros in C?如何在 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 []中的数组

标签: c dynamic macros


【解决方案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;
}

有用的参考:

【讨论】:

  • 1.它是 C 而不是 C++。
  • 2. char arr[] = {0, 'a','b','c'}; if (MACRO(arr + 1,'a','b','c')) ... 会怎么样?
  • 1. 哎呀!谢谢你的收获! @0_______
  • 2. 已修复(:
  • 我有不同数量的参数,你的宏只适用于 3 个字符...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多