次のようなコードを持つコード スニペット (レガシー コード) があります。
typedef void SPECIAL_VOID;
int func (SPECIAL_VOID)
{
.....
}
GCC は、このコードに対して次の警告をスローします。
GCC が不平を言っているのはなぜですか? また、なぜこれが非標準なのですか?
次のようなコードを持つコード スニペット (レガシー コード) があります。
typedef void SPECIAL_VOID;
int func (SPECIAL_VOID)
{
.....
}
GCC は、このコードに対して次の警告をスローします。
GCC が不平を言っているのはなぜですか? また、なぜこれが非標準なのですか?
これは C89 と C99 の間で変更されました。
C89 には (6.5.4.3):
パラメーター型リストは、関数のパラメーターの型を指定し、その識別子を宣言する場合があります。[...]
void
リスト内の唯一のアイテムとしての特別なケースは、関数にパラメーターがないことを指定します。
C99 では、これは (6.7.5.3p10; C11 では 6.7.6.3p10) に変更されます。
void
リスト内の唯一の項目として型の名前のないパラメーターの特殊なケースは、関数にパラメーターがないことを指定します。
void
これは、C89 では、0 パラメーター関数を宣言するときに (前処理後の) リテラル トークンのみが受け入れられるのに対し、C99 では typedef が許可されることを意味すると解釈されることがあります。ただし、これは、欠陥レポート 157によると、標準の意図ではありません。
節 6.7.1 は、関数がパラメーターを取らないことを示す
void
(キーワードの使用とは対照的に) 型を持つ単一のパラメーターであることを明確にしています。void
明確にするために、6.5.4.3 節を言い換えて、重要なvoid
のはキーワードvoid
ではなく type であることを強調する必要があります。
C++ の場合、障害 577により C++ は C99 に準拠します。解決策は C++11 には存在しませんが、ポスト標準ドラフト n3376 には存在するため、標準の次のバージョン、および C++11 の最初の TC に存在すると想定できます。void
明らかな理由から、typedef をテンプレート パラメーターに依存させることはできません。質問G++ エラー: '<anonymous>' has incomplete typeは、g++ に関するこの問題について説明しており、g++ が当分の間コードを拒否し続ける可能性が高いことを示しています。