【发布时间】:2012-04-24 12:20:09
【问题描述】:
我有一个功能:
static int myprintf(const char* fmt, ...)
我想知道所有 myprintf 参数的字节大小,如果它们被打印到缓冲区。
我需要动态分配一个可以打印参数的数组(使用sprinf 或_vsprinf)
例如在 32 位操作系统中,对于 myprintf("%d %c",10,'a');
myprintf 参数的大小为 5。
我尝试像这样实现它:
va_list ap;
va_start(ap, fmt);
myArgSize(ap);
有人可以建议如何实现 myArgSize。
有人告诉我尝试这样的事情
char c;
int len = ::_vsnprintf(&c, 1, fmt, ap);
它不起作用,因为写入了多个字节。 但可能有一些解决方法。
谢谢
【问题讨论】:
-
你说“myprintf 参数的大小是 5”。但如果我明白你在问什么,不,它是堆栈上的 8 个字节。 4 代表 int,4 代表 ehm,另一个 int。在 32 位系统上,可变参数函数中的所有值都是 4 个字节,浮点值除外。
float和double是 8 个字节。并提防long double。 -
您是否对用于字符串表示的字符数或用于值本身的字节数感兴趣?这些是完全不同的,例如以十进制打印时,4 字节整数可能需要 1 到 10 个字符。
-
@MrLister:你抽烟吗?
'a'是 C++ 中的一个字符,根据sizeof的定义,它具有sizeof(char) == 1。在大多数机器上,char是 1 个字节。 -
@MrLister:这不是完全依赖于实现吗?例如,他可以使用自定义调用约定,或者编译器可以内联调用。而且我不认为他的意思是“用于调用函数的堆栈的超级实现依赖大小”,无论如何这将大于参数。参数本身只有一个大小。任何给定的实现可能希望使用比堆栈上更多的空间这一事实是无关紧要的。而且我很确定将错误的格式说明符传递给
printf完全是UB,所以你的例子没有任何意义。 -
@unwind:一个涉及
::func()语法的C题?不会发生。 @MikeSeymour:现在这是一个理性的论点,可能会使结果蒙上阴影。毕竟,我想这取决于你认为的“论点”。 @Yakov:是的,我不得不重新编辑。下次多注意一点。
标签: c++ c printf variadic-functions