【问题标题】:Recoding printf; error in .h file: compiler doesn't recognise the va_list type重新编码 printf; .h 文件中的错误:编译器无法识别 va_list 类型
【发布时间】:2014-05-15 12:46:41
【问题描述】:

我正在用 C 重新编码 printf。所以我正在为每种类型的变量调用函数,所以我在 .h 中对所有这些变量进行了原型化。但是我收到了这个错误:

main.h:22:13: error: unknown type name ‘va_list’
     int dispdi(va_list ap);

解决方案?

【问题讨论】:

  • #include <stdarg.h>了吗?
  • 由于您在 .h 文件中引用 va_list,因此最好先在其中定义该类型(通过包含 stdarg.h)。
  • 无论您在哪里使用可变参数函数,都可以看到 va_list、va_start、va_arg 等的定义。人。必须可见。 #include 的建议是准确的(取决于您的环境)您可以将其包含在 .h 或 .c 中,具体取决于它将在何处为您的可变参数函数提供可见性。

标签: c printf variadic-functions


【解决方案1】:

如果您正在创建自己的所有定义,包括 va_list,那么 我假设您在 .h 中创建的定义看起来至少类似于

#ifndef _VA_LIST_DEFINED
#ifdef _M_CEE_PURE
typedef System::ArgIterator va_list;
#else
typedef char *  va_list;
#endif
#define _VA_LIST_DEFINED
#endif  

只要在你使用你的 printf 版本的地方包含这个 .h

但是,如果您使用的是标准 C 定义的 va_list、va_start、va_arg 等。 al.,然后简单地包含 stdarg.h。

无论哪种情况,下面是一个使用 va_ 宏的简单可变参数函数示例(不是 printf,只是一个简单示例):

#include <stdarg.h>

void variadic_function(int Param, ...) 
{
    int dslot;
    va_list params;
    va_start(params, Param);
    dslot = va_arg(params, int);
    va_end(args);
}  

进一步阅读this Wiki article 及其链接很好地完善了该主题。

【讨论】:

    【解决方案2】:

    在使用va_list 和朋友之前,您应该包含stdarg.h 头文件。

    你的头文件可能是这样的:

    #include <stdarg.h>
    ...
    int my_printf (const char *format, ...);
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-29
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      相关资源
      最近更新 更多