首页 > 解决方案 > 检测空参数然后使用默认大小写的 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__))

标签: cmacros

解决方案


使用 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

推荐阅读