Ошибка при компиляции файла C на сервере RHEL - PullRequest
0 голосов
/ 08 мая 2018
$ gcc -c exsystem.c
    In file included from exsystem1.c:39:
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include/varargs.h:4:2: error: #error "GCC no longer implements <varargs.h>."
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include/varargs.h:5:2: error: #error "Revise your code to use <stdarg.h>."
exsystem1.c: In function âex_fprintfâ:
exsystem1.c:118: error: expected declaration specifiers before âva_dclâ
exsystem1.c:152: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before â{â token
exsystem1.c:174: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before â{â token
exsystem1.c:194: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before â{â token
exsystem1.c:216: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before â{â token
exsystem1.c:237: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before â{â token
exsystem1.c:261: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before âva_dclâ
exsystem1.c:293: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before â{â token
exsystem1.c:312: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before â{â token
exsystem1.c:336: error: expected â=â, â,â, â;â, âasmâ or â__attribute__â before âva_dclâ
exsystem1.c:364: error: expected â{â at end of input

Это ошибки, которые я получаю, когда запускаю этот код Ниже приведен фрагмент кода с ошибками: Может ли кто-нибудь помочь мне переписать этот код в соответствии с новой реализацией stdarg.h.

void ex_fprintf( va_alist )
va_dcl
{
   va_list   args;
   FILE    * fp;
   char    * fmt;
   va_start( args );
   fp = va_arg( args, FILE * );
   fmt = va_arg( args, char * );
   if ( vfprintf( fp, fmt, args ) == EOF )
   {
      va_end( args );
      perror( "fprintf" );
      Raise( Ex_fprintf );
   }
   va_end( args );
   return;

}
void ex_printf( va_alist )
va_dcl
{
   va_list   args;
   char    * fmt;
   va_start( args );
   fmt = va_arg( args, char * );
   if ( vprintf( fmt, args ) == EOF )
   {
      va_end( args );
      perror( "printf" );
      Raise( Ex_printf );
   }
   va_end( args );
   return;

}

1 Ответ

0 голосов
/ 08 мая 2018

Синтаксис аналогичен, но основное отличие состоит в том, что stdarg требует по крайней мере один именованный аргумент в качестве места остановки при циклическом просмотре аргументов в стеке.

Ссылка на эту ссылку объясняет это примерами: http://systemmanager.ru/svcsunix.en/extfile/portapps/stdargvsvarargs.htm


STDARG против VARARGS

Вместо конфликта с историческими процедурами в varargs.h , Международные стандарты Организация / Американский институт стандартов (ISO / ANSI) C стандарт определяет новый механизм для работы со списками переменных аргументов, stdarg.h . Механизм varargs использует магическое имя ( va_alist ) для первого аргумента в списке; stdarg использует последний обязательный аргумент. Это означает, что stdarg должен иметь как минимум один именованный параметр.

Как правило, вы можете легко перевести с varargs на stdarg , потому что большинство функций с переменными списками аргументов имеют известные тип первого аргумента. Следующий пример является тривиальным, функция печати ошибок, использующая механизм varargs :

#include <varargs.h>
printerror( va_alist );

void printerror (va_alist )
va_dcl
{
   va_list ap;
   char *fmt;
   va_start(ap);
   fmt = va_arg(ap, char *);
   vprintf(stderr, fmt, ap);
   va_end(ap);
}

Поскольку функция использует строку формата в качестве первого аргумента, вы можете легко использовать ее в качестве известного аргумента:

#include <stdarg.h>
void printerror (char *fmt, ...)
{
   va_start(ap, fmt);
   vfprintf(stderr, fmt, ap);
   va_end(ap);
}

Вы должны дать первому аргументу имя, даже если процедура принимает завершенный список и без фиксированных аргументов. Например, следующее функция печатает набор строк, но первый аргумент полностью искусственный, созданный для удовлетворения потребностей пакета stdarg :

#include <stdarg.h>
pr_str(char *first, ...)
{
   char * current;
   va_list argp;
   va_start(argp,first);
   current = first;
   while (current != NULL){
   fputs(current,stdout);
   current = va_arg(argp, char *);
   }
   va_end(argp);
}
...