12

次のコードがあります。

typedef void VOID;
int f(void);
int g(VOID);

これは C で問題なくコンパイルされます (Fedora 10 で gcc 4.3.2 を使用)。C++ としてコンパイルされた同じコードで、次のエラーが発生します。

void.c:3: error: ‘<anonymous>’ has incomplete type
void.c:3: error: invalid use of ‘VOID’

さて、これは外部ライブラリにあるもので、所有者にその問題を修正してもらいたいと思います。そこで質問があります - C++ 標準はこの構成を禁止していますか? ポインタ/引用を教えていただけますか?私が覚えている唯一のことは、空のパラメーター リストを通知する (void) を使用した関数宣言が C++ では推奨されていないことですが、typedefed VOID が機能しない理由がわかりません。

4

3 に答える 3

17

はい、私の知る限り、2 番目の宣言は C++ と C89 では無効ですが、C99 では有効です。

C99 ドラフトから、TC2 ( 6.7.5.3/10):

リスト内の唯一の項目として型 void の名前のないパラメーターの特殊なケースは、関数がパラメーターを持たないことを指定します。

キーワードではなく、タイプ「void」について明示的に話しています。

C++ 標準から8.3.5/2:

parameter-declaration-clause が空の場合、関数は引数を取りません。パラメータ リスト(void)は、空のパラメータ リストと同等です。

これは、一般的なタイプの「void」ではなく、「void」を含む実際のキーワードを意味することは、テンプレート引数推定が失敗するケースの 1 つからもわかります ( 14.8.2/2)。

  • パラメーターの型が void である関数型を作成しようとしています。

それは他の人によって明確にされており、ここのコア言語の問題レポートの1つと、他の回答によってリンクされているいくつかのGCCバグレポートで注目に値します。


要約すると、GCC は正しいですが、以前の GCC バージョンは間違っていました。したがって、そのコードは以前に正常にコンパイルされた可能性があります。両方の関数に「void」を使用するようにコードを修正する必要があります。その後、他のコンパイラでもコンパイルされます (comeau は、その「VOID」を含む 2 番目の宣言も拒否します)。

于 2009-02-12T11:06:55.490 に答える
17

gcc バグ。編集:十分に明確ではなかったので、gcc 4.3.2がバグのためにコンパイルしていたということでした。#32364#9278を参照してください。

于 2009-02-12T10:45:03.623 に答える
0

あなたのコードを .cpp ファイルに入れたところ、VS2005、SUSE、Redhat、Solaris で問題なくコンパイルされたので、あなたの特定の gcc バージョンはこれを承認していないと思います。ギャル

于 2009-02-12T10:41:24.007 に答える