如何在 C 中使用宏创建表达式?
How do I create an expression using macros in C?
我需要一个接受输入的宏
MACRO(x, y, z, ...)
并扩展到
arr[0] == x && arr[1] == y && arr[2] == z ...
有什么想法吗?
arr 是 char[],宏参数是单个字符
这个怎么样:
#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
使用升压预处理器:
#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
迭代可变参数,通过数据参数将它们作为元组提供。 BOOST_PP_EXPR_IF
为除第 0 个参数之外的所有参数添加 &&
前缀。
Boost 预处理器是一个只有头文件的库,可以与 C 一起使用。
演示(在 coliru 上)here。
仅供参考,非常小心...我不确定您将如何将其用于通用字符串输入(例如,如果在比较过程中出现 NUL 终止符)。
我需要一个接受输入的宏
MACRO(x, y, z, ...)
并扩展到
arr[0] == x && arr[1] == y && arr[2] == z ...
有什么想法吗?
arr 是 char[],宏参数是单个字符
这个怎么样:
#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
使用升压预处理器:
#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
迭代可变参数,通过数据参数将它们作为元组提供。 BOOST_PP_EXPR_IF
为除第 0 个参数之外的所有参数添加 &&
前缀。
Boost 预处理器是一个只有头文件的库,可以与 C 一起使用。
演示(在 coliru 上)here。
仅供参考,非常小心...我不确定您将如何将其用于通用字符串输入(例如,如果在比较过程中出现 NUL 终止符)。