【问题标题】:can you safely ignore the variable arguments?你可以安全地忽略变量参数吗?
【发布时间】:2014-07-20 06:19:57
【问题描述】:

假设我有一个类似的函数:

#include <stdarg.h>
#include <stdio.h>
void message (const char *fmt, ...)
{
    va_list argptr;
    va_start(argptr, fmt);
    vprintf(fmt, argptr);
    va_end(argptr);
}

我想在另一个上下文中声明一个空函数消息,以便我在没有 printf 而没有 ifdefs 的嵌入式平台上提供源级库

我知道 va_start 必须由 va_end 清理,但是如果我根本不使用那些 va_ 函数,我可以安全地假设编译器会清理堆栈吗?

void message (const char *fmt, ...) {
}

工作?

【问题讨论】:

  • 我假设您引用了“如果我根本不使用它们”这句话。在这种情况下,这就是整个 va_* 函数
  • 您可以一次编辑问题以使其易于理解吗? (我一方面认为您指的是“所有论点”;无论如何,读者不应该为了能够帮助您而猜测您的意思。)

标签: c variadic-functions


【解决方案1】:

是的,忽略变量参数当然是有效的。

多次循环遍历变量参数也同样有效。

【讨论】:

    【解决方案2】:

    当然,你可以忽略任何你想要的参数。
    要告知编译器这就是您真正想要做的事情,但不要给它们起名字。

    请注意,除非您的编译器可以内联调用,否则您的库会避开预处理器而使用空函数,效率会降低。

    为了缓解这种情况,请考虑将您的空函数定义为头文件中的内联函数。

    另外,对于第一个,请考虑将 message 定义为 printf 的别名,因为这实际上就是它的样子。

    【讨论】:

    • 好的,为什么不使用内联空函数。关于别名,这会很有趣,但是 printf 函数不需要非常优化 - 并且可能与指定 stderr 不同。
    • printf(fmt, ...) 始终与fprintf(stdout, fmt, ...) 具有相同的效果。虽然它可能会产生更短的代码......另外,我想我提到过使用inline 函数来绕过ODR。
    • 是的,但实际上我希望调用者源 + 标头源与 lib 源相同(仅与源兼容)。在这里不可能有一个依赖于 stdio 的内联。不管怎样,价格非常低,因为那些不是很常用的功能。
    猜你喜欢
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2023-03-24
    • 2017-04-14
    • 1970-01-01
    • 2021-07-24
    相关资源
    最近更新 更多