c++ - 如何在 C++ 预处理中处理 __VA_ARGS__?
问题描述
#define INITIALIZE_INT_ARRAY(elem_type, array_name,...) \
elem_type array_name[] = { __VA_ARGS__ }; \
INITIALIZE_INT_ARRAY(int, arr, 1, 2, 3, 4, 5)
// will expand to
int arr[] = {1, 2, 3, 4. 5};
现在我想支持元组,__VA_ARGS__
如果它是一个元组,它将简单地获取元组的第一个元素。
INITIALIZE_INT_ARRAY(int, arr, 1, (2, hello), (3, world), (4, X), 5)
// will still expand to
int arr[] = {1, 2, 3, 4, 5}
我怎样才能改变我的INITIALIZE_INT_ARRAY
?
解决方案
通常,在预处理器中遍历逗号分隔的列表需要编写O(n)
样板宏。您可以自己编写或从 Boost.Preprocessor 获取它们,或者...
您可以对列表使用不同的语法:FOO(int, arr, (1)(2, hello)(3, world)(4, X)(5))
.
然后宏可以这样写,没有样板:
#define FOO(type_, name_, seq_) \
type_ name_[] = { FOO_END( FOO_LOOP_A seq_ ) }; \
#define FOO_END(...) FOO_END_(__VA_ARGS__)
#define FOO_END_(...) __VA_ARGS__##_END
#define FOO_LOOP_A(...) FOO_LOOP_BODY(__VA_ARGS__,) FOO_LOOP_B
#define FOO_LOOP_B(...) FOO_LOOP_BODY(__VA_ARGS__,) FOO_LOOP_A
#define FOO_LOOP_A_END
#define FOO_LOOP_B_END
#define FOO_LOOP_BODY(x, ...) x,
推荐阅读
- python - CSV 到 json 转换
- google-cloud-platform - Google Cloud Shell gcloud 命令输出不再漂亮
- r - 是否可以仅用点和标签替换 PCA gg-plot 中的变量箭头?
- python - Raspberry Pi Raspbian 如何连接到 USB 投币器(EMP 800)
- ocr - 如何使用 pytesseract 进行未知方向的文本识别任务?
- ethereum - 尝试将地址字符串转换为 Solidity 中的类型地址
- electron - Electron - 在 Mac 上为 Windows x64 构建安装程序
- java - value.serializer 出错(Docker 中的 Spring Boot 和 Kafka)
- java - 如何使用 Spring Projections 更新 @Entity?
- r - 根据重复行更新列