c++ - 在 C++ 中,为什么 va_start 紧跟在 va_end 之后?
问题描述
我在尝试阅读和理解的项目中的一些函数中看到以下代码:
void Algo::descend(const enc_node* node, const char* option, ...)
{
...
va_list va;
va_start(va, option);
va_end(va);
...
}
我原则上理解可变参数函数,但为什么有人会创建一个可变参数函数,然后va_start()
立即调用,va_end()
中间没有任何内容?这能达到什么目的?
解决方案
在 C++ 中,为什么 va_start 紧跟在 va_end 之后?
不知道。
为什么有人会创建一个可变参数函数,然后立即调用 va_start() ,然后调用 va_end() ,两者之间没有任何内容?
不知道,这没有多大意义。这就像编写int a;
并且从不使用该变量。(可能是程序员心目中没有足够咖啡的迹象。)
这能达到什么目的?
没有什么。
您发布链接的完整功能提供了更多洞察力:
void Algo::descend(const enc_node* node, const char* option, ...)
{
if (logdebug_enabled(LogEncoder)) {
descendLevel++;
printf("%d ",descendLevel);
for (int i=0;i<descendLevel;i++) { printf(" "); }
va_list va;
va_start(va, option);
va_end(va);
fprintf(stdout, ">%s(", name());
vfprintf(stdout, option, va);
fprintf(stdout, ") %d;%d %dx%d %p\n",node->x,node->y,1<<node->log2Size,1<<node->log2Size,node);
}
}
该功能与您提到的链接中的所有其他此类功能一样无效。调用vfprintf
和使用va
afterva_end
是未定义的行为。如果它是一个开放项目 - 帮助社区并通知开发人员。
推荐阅读
- c# - 如何通过 ID 获取记录
- java - 为什么我的 ArrayList 是空的,即使 firebase 数据快照包含孩子
- ios - 设备解锁后在 iOS 上使用 PWA 进行意外缩放
- vba - 使 VBA 窗体出现在 windows 任务栏中
- javascript - 回调和异步
- amazon-web-services - 什么是 AWS Aurora Serverless 扩展时间?
- python - Firebase.post 在我的程序中不起作用
- node.js - Node.js:使用“>”标志生成回显进程
- r - 如何在 R 中自定义情节标题?
- java - 如何使用 mockito 抛出 HttpClientErrorException.Unauthorized 错误