- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么下面的代码不起作用?
#include <stdarg.h>
#include <stdio.h>
// People are missing this in their reponses.... 'fmt' here is passed by
// reference, not by value. So &fmt in _myprintf is the same as &fmt in
// myprintf2. So va_start should use the address of the fmt char * on the
// stack passed to the original call of myprintf2.
void _myprintf(const char *&fmt, ...)
{
char buf[2000];
//---
va_list ap;
va_start(ap, fmt);
vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap);
//---
printf("_myprintf:%sn", buf);
}
void myprintf2(const char *fmt, ...)
{
_myprintf(fmt);
}
void myprintf(const char *fmt, ...)
{
char buf[2000];
//---
va_list ap;
va_start(ap, fmt);
vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap);
//---
printf(" myprintf:%sn", buf);
}
int main()
{
const char *s = "string";
unsigned u = 11;
char c = 'c';
float f = 2.22;
myprintf("s='%s' u=%u c='%c' f=%fn", s, u, c, f);
myprintf2("s='%s' u=%u c='%c' f=%fn", s, u, c, f);
}
我希望两行输出相同,但它们不同:
myprintf:s='string' u=11 c='c' f=2.220000
_myprintf:s='string' u=2020488703 c='c' f=0.000000
我以为va_start()
用的是fmt
变量的地址,应该是字符串指针在栈上的地址。
最佳答案
va_start
确实使用您提供给它的变量的地址。使用 myprintf2
,您只将一个参数传递给 myprintf
,因此当您尝试访问第二个参数(s
的传递值)时它不在那里,您会看到保存的寄存器、返回地址或位于堆栈中的其他内容。
要执行您想要执行的操作,您需要将 va_list
变量传递给由您的两个类似 printf 的函数调用的公共(public)函数。
编辑:根据 C++ 语言标准,“如果参数 parmN 是引用类型,或者是与传递没有参数的参数时产生的类型不兼容的类型,则行为未定义” (parmN是传递给va_start的参数。)
编辑 2:示例未编译实现:
void myprintf_core(const char *fmt, va_list ap);
void myprintf2(const char *fmt, ...) {
//...
va_list ap;
va_start(ap, fmt);
myprintf_core(fmt, ap);
va_end(ap); // could be included in myprintf_core
}
myprintf_core
是您的 _myprintf
但没有 3 个 va_
行,它们已移至 myprintf2
。
关于c++ - 我可以引用 va_start() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39732045/
代码工作完美,但 gcc 和 clang 报告 va_start 上存在问题 stackoverflow 要求我再写一些东西,但我真的不知道是什么 =) int Matrix_cool_input (
在带有可变参数的函数中,我们使用函数 va_start() 初始化一个 va_list 类型的对象,'ap' 为: void va_start(va_list ap, parmN); 我不明白 1.什
根据我对 va_arg 宏的了解,它检索参数列表指向的下一个参数。有什么方法可以选择我想要获取的参数的索引,比如数组索引? 例如,我需要执行一个操作,我需要至少调用 3 次 va_arg 宏,但我希望
我正在阅读 The Linux Programming Interface 一文,他们展示了这个函数来处理错误。在手册页( man stdarg )中它说 va_start必须首先调用以初始化 ap供
据说调用 va_start() 之后必须调用 va_end() 因为 va_start()(总是?)扰乱堆栈。 任何人都可以解释一下调用 va_start() 是如何修改堆栈的,以及这种修改如何帮助获
对于下面的代码: void fun(char *msg, int n, int m, ...) { va_list ptr; va_start(ptr, m); // Questio
在开始使用 va_list 之前提前退出带有可变参数的函数是否安全? ? #include int func(const char * format, ...){ if(format ==
我要制作varargs一次释放多个指针的函数,主要是为了清理代码。所以我有: void free_all( ... ) { va_list arguments; /* Initiali
为什么下面的代码不起作用? #include #include // People are missing this in their reponses.... 'fmt' here is pas
我正在使用 Visual Studio 2012 编译此示例代码: #include #include const char * __cdecl foo(const char * format,
在对历史悠久的类进行编辑时,我被架构师的一个特殊习惯所困扰,他将 va_start -> va_end 序列包装在互斥锁中。该添加的更改日志(大约 15 年前制作,此后没有修改)指出这是因为 va_s
出于某种原因,我无法正常工作: void examplefunctionname(string str, ...){ ... va_start(ap, str.c_str()); 我也
编辑:我现在有 #include 它编译 - 但可变参数没有通过。有什么想法吗? 我有这段代码(摘录): void msg(char* message, ...) { va_list args
我想创建一些日志记录,我创建了一个类。但是我在将参数传递给它时遇到了一些问题。 类: namespace debug { class log { private:
我必须在嵌入式应用程序中使用 IAR 编译器(它没有命名空间、异常、多重/虚拟继承、模板有点限制并且仅支持 C++03)。我不能使用参数包,所以我尝试使用可变参数创建成员函数。我知道可变参数通常是不安
这是我的最小示例: #include #include #include void print_strings_and_lengths(int count, ...) { va_list
具有以下 header 的函数: int max(int n, va_list vals) 在函数内部调用: int max_first(int n, ...) 需要一个 va_start(vals,
我想使用 va_start 从省略号中检索我的参数。 这是我的代码: char str[256]; void nrf_log_flash(bool is_to_save, char * log, ..
我很难在 x64 中编译我的程序。虽然我能够修复所有问题并进行编译,但我的程序在日志记录时崩溃了: void TLog::VLogAddFormat(COLORREF colorText, const
我试图在我的项目中使用 va_start 和 va_end 函数,但 eclipse 不想将其解析为函数。 gcc 编译整个项目没有错误... [我的文件.cpp] #include #includ
我是一名优秀的程序员,十分优秀!