首页 > 解决方案 > 在#define 指令中,如何修复“预期的声明说明符之前”?

问题描述

我有源代码包含 cccp.c 文件。在第 195 行有:

#if defined (__STDC__) && defined (HAVE_VPRINTF)
# include <stdarg.h>
# define VA_START(va_list, var) va_start (va_list, var)
# define PRINTF_ALIST(msg) char *msg, ...
# define PRINTF_DCL(msg)
# define PRINTF_PROTO(ARGS, m, n) \
            PROTO (ARGS) __attribute__ ((format (__printf__, m, n)))
#else
# include <varargs.h>
# define VA_START(va_list, var) va_start (va_list)
# define PRINTF_ALIST(msg) msg, va_alist
# define PRINTF_DCL(msg) char *msg; va_dcl  ////====here is the error
# define PRINTF_PROTO(ARGS, m, n) () __attribute__ ((format (__printf__, m, n)))
# define vfprintf(file, msg, args) \
    { \
      char *a0 = va_arg(args, char *); \
      char *a1 = va_arg(args, char *); \
      char *a2 = va_arg(args, char *); \
      char *a3 = va_arg(args, char *); \
      fprintf (file, msg, a0, a1, a2, a3); \
    }
#endif

...

void
warning (PRINTF_ALIST (msg))
     PRINTF_DCL (msg)   ///the use macro part
{
  va_list args;

  VA_START (args, msg);
  vwarning (msg, args);
  va_end (args);
}

static void
fatal (PRINTF_ALIST (msg))
     PRINTF_DCL (msg)
{
  va_list args;

  fprintf (stderr, "%s: ", progname);
  VA_START (args, msg);
  vfprintf (stderr, msg, args);
  va_end (args);
  fprintf (stderr, "\n");
  exit (FATAL_EXIT_CODE);
}

我的编译器显示此错误:

error: expected declaration specifiers before ‘va_dcl’
195 | # define PRINTF_DCL(msg) char *msg; va_dcl

何时定义宏应用,就像:

PRINTF_DCL (msg)

源文件类似于:https ://cis.temple.edu/~ingargio/cis307/software/mico/cpp/cccp.c 但在该文件中,代码行是 199。

我不知道为什么会有';' 在 va_dcl 之前。并且不知道如何解决它。

标签: cc-preprocessor

解决方案


va_dcl是一个过时的工具,用于在标准化之前很久的语言方言中声明可变参数函数。(参考文献1、2

我怀疑编译器在这里走错了路。尝试-DHAVE_VPRINTF在命令行上编译。


推荐阅读