関数プロトタイプを持つレガシーコード Ac をコンパイルするには
void somefun(...)
gcc 4.1.2 は常にエラーを通知します
error: ISO C requires a named argument before ...
しかし、コードを変更することはできません。このコードを GCC にコンパイルさせるには、どの C ダイアレット オプションを使用すればよいでしょうか?
gcc -c A.c ????
もうそれは不可能だと思います。このコメントを参照してください(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 `...'");
GCC2.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);
GCCのC方言はどれもこれを受け入れないと思いますが、G++は受け入れます。あなたができることは、関数定義をextern "C" {}ブロックに入れ、それを含むモジュールをコンパイルすることですg++(それが有効なC ++関数でもあると仮定します)。
void somefun()次に、 (K&Rスタイル)を使用してCで宣言する必要があります。
ただし、これにはとのリンクも必要になりg++ます。
C ++リンケージが必要なものでない場合は、引数をとらないように関数を変更し、K&Rスタイルで宣言する必要があります。