Какой диалект c может позволить GCC собрать немного веселья (...)? - PullRequest
6 голосов
/ 24 июля 2011

Для компиляции некоторого устаревшего кода A.c, который имеет прототип функции

void somefun(...)

gcc 4.1.2 всегда сообщает об ошибке

 error: ISO C requires a named argument before ...

Но я не могу изменить код, поэтому какую опцию C-dialet я должен использовать, чтобы позволить GCC скомпилировать этот код?

gcc -c A.c ????

Ответы [ 2 ]

4 голосов
/ 24 июля 2011

Я не думаю, что это возможно больше.См. Комментарий в этом (3.4.0 - уже довольно старый) источник GCC c-parse.in :

/* This is what appears inside the parens in a function declarator.
   Is value is represented in the format that grokdeclarator expects.  */
parmlist_2:  /* empty */
        { $$ = get_parm_info (0); }
    | ELLIPSIS
        { $$ = get_parm_info (0);
          /* Gcc used to allow this as an extension.  However, it does
             not work for all targets, and thus has been disabled.
             Also, since func (...) and func () are indistinguishable,
             it caused problems with the code in expand_builtin which
             tries to verify that BUILT_IN_NEXT_ARG is being used
             correctly.  */
          error ("ISO C requires a named argument before `...'");

GCC 2.95.3 имеет такой же комментарий.

Более новые версии GCC (4.6.1) также не видят возможности принять этот код (из gcc / c-parse.c):

static struct c_arg_info *
c_parser_parms_list_declarator (c_parser *parser, tree attrs)
{
...
  if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
    {
      struct c_arg_info *ret = build_arg_info ();
      /* Suppress -Wold-style-definition for this case.  */
      ret->types = error_mark_node;
      error_at (c_parser_peek_token (parser)->location,
        "ISO C requires a named argument before %<...%>");
      c_parser_consume_token (parser);
3 голосов
/ 24 июля 2011

Я не думаю, что какой-либо из диалектов C в GCC принимает это, но G ++ делает Что вы можете сделать, это поместить определение функции в блок extern "C" {} и скомпилировать модуль, содержащий его, с помощью g++ (при условии, что это также допустимая функция C ++).

Затем вы должны объявить его в C с void somefun() (стиль K & R).

Это также потребует связи с g++.

Если компоновка C ++ - это не то, что вам нужно, то вы должны изменить функцию, чтобы она не принимала аргументы, и объявить ее в стиле K & R.

...