c - 检测空参数然后使用默认大小写的 C 宏
问题描述
我有宏可以扩展为一个数字(在我的示例中,案例 2 和 4),或者什么都没有(在我的示例中,案例 1 和 3)。虚无对我来说是不可取的,所以我需要其他可以检测和替换虚无的宏。
我能够创建一个宏,OLD_CHECK
来检测虚无情况并将其替换为 0。(案例 1)
我想改进它并创建一个新的宏,NEW_CHECK
它将检测虚无情况并将其替换为默认值。(案例三)
/* what I currently have */
print("case 1: [%d]", OLD_CHECK( )); // case 1: [0]
print("case 2: [%d]", OLD_CHECK(5)); // case 2: [5]
/* what I hope to achieve */
int default_value = 7;
print("case 3: [%d]", NEW_CHECK(default_value, )); // case 3: [7]
print("case 4: [%d]", NEW_CHECK(default_value, 5)); // case 4: [5]
为了写OLD_CHECK
,我使用了参数的数量。这种方法似乎不可行NEW_CHECK
,因为案例 3 和 4 都被检测为具有 2 个参数。
编辑:这是用于捕获和处理案例 1 和 2 的宏:
/* Given a dummy and >=1 arguments, expand to the first argument */
#define FIRST_ONE(dummy, a1, ...) a1
/* if "..." is nonblank, expand to the first arg of "...". otherwise, expand to 0 */
#define OLD_CHECK(...) OLD_CHECK_CORE(__VA_ARGS__)
#define OLD_CHECK_CORE(...) FIRST_ONE(dummy, ##__VA_ARGS__, 0)
编辑 2:在案例 3 中必须有尾随逗号。这是一系列其他更复杂的宏的不幸副产品。
回答: p00ya 给出的这个方法对我有用:
#define NEW_CHECK_HELPER(...) , ## __VA_ARGS__
#define NEW_CHECK(default, ...) (default NEW_CHECK_HELPER(__VA_ARGS__))
解决方案
使用 GCC 的, ## __VA_ARGS__
逗号删除扩展(您已经在使用它OLD_CHECK
):
#include <stdio.h>
#define NEW_CHECK_HELPER(...) , ## __VA_ARGS__
#define NEW_CHECK(default, ...) (default NEW_CHECK_HELPER(__VA_ARGS__))
int
main() {
int default_value = 7;
printf("case 3: %d\n", NEW_CHECK(default_value, ));
printf("case 4: %d\n", NEW_CHECK(default_value, 5));
}
印刷:
case 3: 7
case 4: 5
推荐阅读
- c++ - 为什么可以使用右值引用作为没有生命周期问题的成员?
- flutter - 如何在 Flutter 中扭曲图标按钮
- c - 初始化大小为 2 的数组是否与分配大小为 2 的数组的指针相同?
- angular - 如何在 Angular 11 / Rxjs 中等待更新时保留可观察异步管道数组的最后一个值
- node.js - 我的反应角色代码不起作用 Discord.JS
- javascript - jquery模态调用另一个函数,从另一个函数调用时打开
- powerbi - DAX- 列查找
- javascript - javascript绑定方法参数
- powershell - 从 Function App Powershell 脚本向 Azure DevOps 进行身份验证
- c++ - 在类构造函数之前调用函数