Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使宏返回字符而不是字符串?_C_Generics_Macros - Fatal编程技术网

C 如何使宏返回字符而不是字符串?

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

我有以下宏(后续:):

问题是mu_格式说明符似乎解析为一个
char*
,而不是简单地将
%lu
替换为
“必需的:%s!=%s,实际值:%s==”mu_格式说明符(实际值),
,我希望生成
“必需的:%s!=%s,实际值:%s==”“%lu”
哪个C可以理解为一个文本字符串

我可以看到两个可怕的解决办法:

  • 使每个类型的mu_assert_版本相等,并使用
    \u Generic
    调用正确的版本

  • snprintf格式化字符串,但是如果格式化字符串必须是
    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