6

次のような C++ コードをいくつか見つけました。

typedef Request Request;

これは単なる操作なしですか、それともこの typedef 実際には効果がありますか? もしそうなら、どのような効果がありますか?

4

2 に答える 2

9

セクション 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 を使用して型を再定義し、別の型にエイリアスすることは禁止されていると言われています。

于 2012-05-24T15:57:23.113 に答える
1

Requestパラメータとしてのみ渡された場合は、不透明なポインタのようです。
あるはずです

typedef struct Request Request 

コードのどこかに。(質問へのコメントを参照)
これは、APIを定義し、実装の詳細を非表示にするために使用されます。したがって、APIを再度変更せずに、後で実装を変更できます。

クライアントは、実際のタイプについて何も知る必要はありません-それは単なるハンドルの一種です。
それを使ってやりたいことはすべて、APIメソッド(作成、削除、ロード、初期化など)で行う必要があります。
通常、ハンドルRequestは、APIの実装でより意味のあるものにキャストされます。これは通常、古いCで行われました。

于 2012-05-24T16:12:04.063 に答える