次のような C++ コードをいくつか見つけました。
typedef Request Request;
これは単なる操作なしですか、それともこの typedef 実際には効果がありますか? もしそうなら、どのような効果がありますか?
セクション 7.1.3 で、C++2003 ANSI ISO IEC 14882 2003 のtypedef指定子に関連するすべての規則を読むことができます。7.1.3 では、2)名前がすでに何らかの型を参照している場合、同一性typedefが許可されると言われています。
これは合法です:
typedef int Request;
typedef Request Request; // Redefines "Request" with no effect
そして、そうではないこと:
typedef Request Request; // Illegal, first "Request" doesn't name a type.
規格には、これに関連する具体的な例があります。C++2003、§7.1.3/2:
特定の非クラス スコープでは、typedef 指定子を使用して、そのスコープで宣言されている任意の型の名前を再定義し、既に参照している型を参照できます。【例:
typedef struct s { /* ... */ } s;
typedef int I;
typedef int I;
typedef I I;
—<em>例の終わり]
7.1.3 では、3) typedef を使用して型を再定義し、別の型にエイリアスすることは禁止されていると言われています。
Request
パラメータとしてのみ渡された場合は、不透明なポインタのようです。
あるはずです
typedef struct Request Request
コードのどこかに。(質問へのコメントを参照)
これは、APIを定義し、実装の詳細を非表示にするために使用されます。したがって、APIを再度変更せずに、後で実装を変更できます。
クライアントは、実際のタイプについて何も知る必要はありません-それは単なるハンドルの一種です。
それを使ってやりたいことはすべて、APIメソッド(作成、削除、ロード、初期化など)で行う必要があります。
通常、ハンドルRequest
は、APIの実装でより意味のあるものにキャストされます。これは通常、古いCで行われました。