- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有以下代码:
va_list va[2];
va_start(va[0], fmt);
va_start(va[1], fmt);
process(fmt, va);
va_end(va[0]);
va_end(va[1]);
我查看了各种站点以获取关于 va_start
和 va_end
的文档,他们只说 va_end
应该为每个调用va_start
在调用函数返回之前。
我不确定调用顺序是否重要。特别是,是
va_end(va[0]);
va_end(va[1]);
在语义上与
相同va_end(va[1]);
va_end(va[0]);
在上面的示例代码中?
最佳答案
C99 标准中唯一相关的要求是:
7.15.1 Variable argument list access macros
1 [...] Each invocation of the
va_start
andva_copy
macros shall be matched by a corresponding invocation of theva_end
macro in the same function.
多个va_end
的顺序没有要求与 va_start
匹配的调用, 或与 va_start
的反向匹配,因此实现需要接受任一顺序。
你甚至可以使用像这样一团糟
void f(int a, ...) {
va_list ap;
goto b;
a:
va_end(ap);
return;
b:
va_start(ap, a);
goto a;
}
这符合标准的所有要求,因此实现必须接受它。结果,即使是va_end
不允许扩展为带有不匹配大括号的内容。
在实践中,我什至不知道任何当前的实现 va_end
有任何必要的效果。我能够找到的所有实现最多将值(或第一个子值,取决于类型)设置为零,这将进一步使用 va_arg
失败,但如果省略 va_end
也不会导致问题从你的代码。大多数人甚至不这样做。现在,我实际上不会从代码中删除它,因为有合理的理由说明一个实现(当前或 future )实际上可能在其 va_end
中做某事。 ,但您可以假设当前和 future 的实现至少会尝试以符合标准要求的方式实现它。
使用 #define va_end(ap) }
的历史实现就是这样:历史。他们没有在 <stdarg.h>
中提供该宏,他们甚至没有 <stdarg.h>
header 。你不应该担心他们。
关于c++ - 多个 va_end 调用的顺序是否重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25652021/
我有一个基于 printf 样式格式的日志记录框架: void Logger::debug(const char *fmt, ...) { va_list args; va_start
我有以下代码: va_list va[2]; va_start(va[0], fmt); va_start(va[1], fmt); process(fmt, va); va_end(va[0]);
MSDN显示 vsnprintf_s 的示例代码片段: // crt_vsnprintf_s.cpp #include #include void FormatOutput(LPCSTR form
在处理可变参数时,是只是 va_start() 需要匹配的 va_end() 调用,还是 va_copy()也需要匹配的 va_end(),即 void foo(char *x, ...) { v
va_end - Macro to reset arg_ptr. 在访问变量参数列表后,arg_ptr 指针通常用va_end() 重置。我知道如果您想重新迭代列表,它是必需的,但如果您不打算这样做,
这是我的最小示例: #include #include #include void print_strings_and_lengths(int count, ...) { va_list
我试图在我的项目中使用 va_start 和 va_end 函数,但 eclipse 不想将其解析为函数。 gcc 编译整个项目没有错误... [我的文件.cpp] #include #includ
我有一个封装 CString::FormatV 的函数函数,并且我需要能够检测是否向该函数传递了一个空参数列表。执行此操作的最佳方法是什么? 我现在的代码是这样的 CString ADString::
(一)写一个简单的可变参数的C函数 下面我们来探讨如何写一个简单的可变参数的C函数.写可变参数的C函数要在程序中用到以下这些宏: 复制代码 代码如下: void va_start(
我需要使用 %%在格式字符串中以便写入 %像这样的字符: printf("%%"); 我正在尝试在我的可变参数列表函数中执行此操作。格式说明符工作正常,例如 %d , %s等等 但是当我尝试写 %字符
如果我的理解是正确的,va_end 被调用以进行清理并且在相同的上下文中,va_end 的手册页说明了这一点 va_end() Each invocation of va_start() must b
在此问答中,您应始终调用 va_end(): What exactly is va_end for? Is it always necessary to call it? 但是如果在到达 va_end
由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载。对这种情况,提出了指针参数来解决问题。 如printf()函数,其原型为
这是我的代码。它们是Objective-C语言: - (void)objcMethod:(NSString *)format, ... { va_list args; va_start(args, f
我使用下一个函数: void CharTest(const char * format,...) { char buffer[1024]; va_list args; va_star
谁能告诉我如何使用 va_start、va_end、 实现 printf 或 scanf va_arg 和系统调用读/写应该是什么样子? 我有这样的东西: #include #include ch
我的代码包含如下片段: std::va_list ap; va_start(ap, msgfmt); snprintf_buf buf; const tchar * m
我是一名优秀的程序员,十分优秀!