Chinaunix

标题: 关于可变参数的错误 [打印本页]

作者: sumland    时间: 2011-01-10 10:35
标题: 关于可变参数的错误
  1. #ifdef HAVE_STDARG_H
  2. void
  3. GifQprintf(char *Format, ...) {
  4.     char Line[128];
  5.     va_list ArgPtr;

  6.     va_start(ArgPtr, Format);

  7. #else
  8. #  ifdef HAVE_VARARGS_H
  9. void
  10. GifQprintf(va_alist)
  11.            va_dcl
  12. {
  13.     char *Format, Line[128];
  14.     va_list ArgPtr;

  15.     va_start(ArgPtr);
  16.     Format = va_arg(ArgPtr, char *);
  17. #  endif /* HAVE_VARARGS_H */
  18. #endif /* HAVE_STDARG_H */
  19.     if(GifQuietPrint)                  ///// line 57
  20.         return;

  21.     vsprintf(Line, Format, ArgPtr);       //// line 60
  22.     va_end(ArgPtr);

  23.     fputs(Line, stderr);
  24. }
复制代码
我在调用这个函数时提示下面的错误

../lib/qprintf.c:57: 错误:expected identifier or ‘(’ before ‘if’
../lib/qprintf.c:60: 警告:数据定义时没有类型或存储类
../lib/qprintf.c:60: 警告:函数声明中出现形参名却未指定类型
../lib/qprintf.c:61: 警告:数据定义时没有类型或存储类
../lib/qprintf.c:61: 警告:函数声明中出现形参名却未指定类型
../lib/qprintf.c:63: 警告:数据定义时没有类型或存储类
../lib/qprintf.c:63: 警告:函数声明中出现形参名却未指定类型
../lib/qprintf.c:64: 错误:expected identifier or ‘(’ before ‘}’ token
作者: erlangs    时间: 2011-01-10 10:49
貌似是你宏定义的问题
作者: liyandong106    时间: 2011-01-10 11:02
似乎就是宏的问题
作者: sumland    时间: 2011-01-10 11:06
大侠能不能指点出来问题在哪呢?
作者: omycle    时间: 2011-01-10 11:12
把第21行代码,放到最后,就好了。
作者: sumland    时间: 2011-01-10 11:26
回复 5# omycle


    不对啊!我试过了也不行的
作者: sumland    时间: 2011-01-10 11:39
  1. #ifndef HAVE_CONFIG_H
  2. #include <config.h>
  3. #endif

  4. #include <stdio.h>

  5. #ifndef HAVE_STDARG_H
  6. #include <stdarg.h>
  7. #elif defined (HAVE_VARARGS_H)
  8. #include <varargs.h>
  9. #endif /* HAVE_STDARG_H */

  10. #include "gif_lib.h"

  11. #ifdef __MSDOS__
  12. int GifQuietPrint = FALSE;
  13. #else
  14. int GifQuietPrint = TRUE;
  15. #endif /* __MSDOS__ */

  16. /*****************************************************************************
  17. * Same as fprintf to stderr but with optional print.
  18. *****************************************************************************/
  19. #ifdef HAVE_STDARG_H
  20. void
  21. GifQprintf(char *Format, ...) {
  22.     char Line[128];
  23.     va_list ArgPtr;

  24.     va_start(ArgPtr, Format);
  25. #else
  26. #ifdef HAVE_VARARGS_H
  27. void
  28. GifQprintf(va_alist)
  29.            va_dcl
  30. {
  31.     char *Format, Line[128];
  32.     va_list ArgPtr;

  33.     va_start(ArgPtr);
  34.     Format = va_arg(ArgPtr, char *);
  35. #endif /* HAVE_VARARGS_H */
  36. #endif /* HAVE_STDARG_H */
  37.     if (GifQuietPrint)
  38.         return;

  39.     vsprintf(Line, Format, ArgPtr);
  40.     va_end(ArgPtr);

  41.     fputs(Line, stderr);
  42. }
复制代码
改成这样 还是不行啊
作者: drangon    时间: 2011-01-10 12:59
看看 HAVE_STDARG_H 和 HAVE_VARARGS_H 有没有定义,

如果是gcc,那么加 -save-temps 参数,然后看看 xxx.i 文件分析一下
作者: sumland    时间: 2011-01-10 14:58
回复 8# drangon

提示这样的错误啊
  1. [root@localhost util]# gcc gif2rgb.c ../lib/qprintf.c -o gif2rgb1  -save-temps  
  2. 在包含自 ../lib/qprintf.c:19 的文件中:
  3. /usr/lib/gcc/x86_64-redhat-linux/4.1.2/include/varargs.h:4:2: 错误:#error "GCC no longer implements <varargs.h>."
  4. /usr/lib/gcc/x86_64-redhat-linux/4.1.2/include/varargs.h:5:2: 错误:#error "Revise your code to use <stdarg.h>."
复制代码

作者: sumland    时间: 2011-01-10 15:20
大侠们 怎么办呢?
作者: drangon    时间: 2011-01-10 17:13
本帖最后由 drangon 于 2011-01-10 17:15 编辑

HAVE_STDARG_H 和 HAVE_VARARGS_H 到底是什么回事?

理论上应该是configure脚本检测生成的,一般情况下,应该是定义了 HAVE_STDARG_H 而不能定义 HAVE_VARARGS_H

楼主的编译好像是一开始两个都没定义,后来又定义了 HAVE_VARARGS_H 。。。。或者不知什么原因引用了 varargs.h 头文件,这个头文件已经不支持了,要用 stdarg.h
楼主的情况不了解,无责任乱猜
作者: omycle    时间: 2011-01-10 20:41
把你预处理后的结果看一下就知道了。看宏定义了没有
作者: sumland    时间: 2011-01-11 09:11
我也不知道怎么办啊?这两个宏确实没有定义,却又出现预编译里面。
作者: sumland    时间: 2011-01-11 09:35
求大侠指点一下啊!那个宏是没有定义也没关系吧 我可以固定使用一个头文件啊
作者: sumland    时间: 2011-01-11 09:35
问题是我固定使用stdarg.h还是有问题啊




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2