如何在 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
将 &&
作为除第 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 中使用宏创建表达式?的主要内容,如果未能解决你的问题,请参考以下文章