C 如何使宏返回字符而不是字符串?
我有以下宏(后续:): 问题是mu_格式说明符似乎解析为一个C 如何使宏返回字符而不是字符串?,c,generics,macros,C,Generics,Macros,我有以下宏(后续:): 问题是mu_格式说明符似乎解析为一个char*,而不是简单地将%lu替换为“必需的:%s!=%s,实际值:%s==”mu_格式说明符(实际值),,我希望生成“必需的:%s!=%s,实际值:%s==”“%lu”哪个C可以理解为一个文本字符串 我可以看到两个可怕的解决办法: 使每个类型的mu_assert_版本相等,并使用\u Generic调用正确的版本 snprintf格式化字符串,但是如果格式化字符串必须是const,我可能会遇到问题 有更好的选择吗 (问题是,\u G
char*
,而不是简单地将%lu
替换为“必需的:%s!=%s,实际值:%s==”mu_格式说明符(实际值),
,我希望生成“必需的:%s!=%s,实际值:%s==”“%lu”
哪个C可以理解为一个文本字符串
我可以看到两个可怕的解决办法:
\u Generic
调用正确的版本const
,我可能会遇到问题\u Generic
实际上计算表达式,而不是简单地替换源字符-即,%lu”
成为它自己的文本字符串,而不是仅仅生成与所需的“统一的源字符:%s!=%s,reality:%s==”我使它工作:
#define mu_assert_equal(actual, expected) do { \
if (actual != expected) { \
char *message = malloc(MAX_ERROR_MESSAGE_LENGTH); \
if (message == NULL) { printf("malloc failed"); exit(1); } \
snprintf(message, MAX_ERROR_MESSAGE_LENGTH, _Generic( \
(actual), \
unsigned long: "required: %s != %s, reality: %s == %lu", \
int: "required: %s != %s, reality: %s == %i" \
), \
#actual, #expected, #actual, actual); \
return message; \
} \
} while (0)
解决方案是使整个格式化字符串成为\u Generic
的输出表达式
从测试代码:
mu_assert_equal(bytes_parsed, 1);
我得到输出:
required: bytes_parsed != 1, reality: bytes_parsed == 0
预处理阶段的输出是什么?@SergeBallesta我就是这样修复的-我保存了预处理器的输出,然后读取了错误消息,这要好得多。这让我看到\u Generic
的输出是一个表达式,而不是一系列源代码字节。我错误地认为,泛型是某种形式的简单宏观扩张。
required: bytes_parsed != 1, reality: bytes_parsed == 0