gpt4 book ai didi

c++ - 这个递归 va_arg 代码有什么问题?

转载 作者:太空狗 更新时间:2023-10-29 23:47:53 24 4
gpt4 key购买 nike

我正在尝试制作一个采用可变参数列表的通用函数。设计的一部分是其中一些功能相互调用。不幸的是,它似乎不起作用。运行下面的简单代码可以看到,command() 的调用总是失败,但是直接调用 marshal_size() 成功地根据格式字符串“FORMAT_STRING”解码了两个字符串“FIRST_STR_ARG”和“SECOND_STR_ARG” .

我的推理有什么问题?

示例代码与“g++ main.cpp”或“gcc main.c”编译得同样好。

谢谢,
朱尔斯

#include <stdarg.h>
#include <stdio.h>
#include <inttypes.h>
#include <string.h>
#include <stdlib.h>

#define MARSHAL_FORMAT "%s%s"
#define FIRST_STR_ARG "THIS_IS_ARG_ONE"
#define SECOND_STR_ARG "THIS_IS_ARG_TWO"

#define d(msg__, ...) do { printf("%s@%d: "msg__"\n", __FILE__, __LINE__, ## __VA_ARGS__); } while (0)

static uint32_t
marshal_size(const char *format, ...)
{
uint32_t retv = 0;
uint8_t ub;
uint16_t uw;
uint32_t ul;
char *s;
va_list ap;

if (!format || !strlen(format))
return 0;
d("format = %s \n", format);

va_start(ap, format);
for (; '\0' != *format; format++) {

d("*format = %c \n", *format);
if ('%' == *format) {
format++;
if ('u' == *format)
format++;
} else {
d("FORMAT ERROR\n");
continue;
}
d("*format = %c \n", *format);

switch (*format) {
case 's':
s = va_arg(ap, char*);
d("va_arg = %s\n", (s ? s : "NULL"));
if (s)
retv += strlen(s) + 1;
break;
case 'l':
ul = va_arg(ap, uint32_t);
retv += sizeof(uint32_t);
break;
case 'w':
uw = (uint16_t)va_arg(ap, int);
retv += sizeof(uint16_t);
break;
case 'b':
ub = (uint8_t)va_arg(ap, int);
retv += sizeof(uint8_t);
break;
default:
goto exit;
}

continue;
exit:
break;
}

va_end(ap);

return retv;
}

static uint32_t
command(const char * const format,
...)
{
uint32_t retv;
va_list ap;

va_start(ap, format);

retv = marshal_size(format, ap);

va_end(ap);

return retv;
}

int
main(int argc, char *argv)
{
uint32_t size;

size = command(MARSHAL_FORMAT, FIRST_STR_ARG, SECOND_STR_ARG);
d("size = %d", size);

size = marshal_size(MARSHAL_FORMAT, FIRST_STR_ARG, SECOND_STR_ARG);
d("size = %d", size);

return EXIT_SUCCESS;
}

最佳答案

您必须使 marshal_size 采用 va_list 而不是 ...。参见 Question 15.12在 c-faq.com 的常见问题解答中。

关于c++ - 这个递归 va_arg 代码有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3366978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com