1

次のようなステートメントに気付きました。

  __in HMODULE Module,
  __in PSTR ImportedModuleName,
  __in PSTR ImportedProcName,
  __in PVOID AlternateProc,
  __out_opt PVOID *OldProc

これらのステートメント内に、2 つの _ _ と ( in ) という単語が表示されます。

さて、sal.h を見ていると、非推奨の注釈の下に気づきました。

// sal.h  
_in    : The function will only read from the buffer. The
caller must provide the buffer and initialize it. Cannot be used with _deref.

アンダースコアは 1 つだけです。私がネット上で見るすべてのソース コードに 2 つのアンダースコア ( _ _ in ) があるのはなぜだろうと思っていました。私の上記の発言のように。

4

3 に答える 3

1

名前空間をサポートしない言語 (C) またはコンパイラ機能 (プリプロセッサ) がある場合、それは軍拡競争の結果です。__declspecまたは、 や などの非標準のキーワードを言語に追加し__attribute__ます。_underscore で始まる識別子名は、実装者に予約されています。残念ながら、その帽子をかぶっている人は複数います。実装者は、コンパイラとその CRT 実装を記述したプログラマである場合があります。または、sal.h のようなコア ライブラリを作成したプログラマである場合もあります。

または、ヘッダーがプロジェクトにとって非常に重要であり、コードの残りの部分との名前の衝突を避けるためにアンダースコアを使用することを決定したのは、あなた自身である可能性があります。間違った決定ですが、非常に一般的に行われます。

これにより、実装者は名前の衝突を避けるために複数のアンダースコアを使用する必要があります。

于 2012-06-02T13:41:12.930 に答える
1

_insal.h コメントで気づいたのは、可能な注釈部分の 1 つです。注釈全体は、追加のアンダースコアから始まります。次の例を参照してください。

NTDSAPI
void
WINAPI
DsFreeSpnArrayA(
    __in DWORD cSpn,
    __deref_in_ecount(cSpn) LPSTR *rpszSpn
    );
于 2012-06-02T14:51:24.267 に答える
0

注意:これらはステートメントではなく、パラメータ宣言です。

二重アンダースコアまたは単一アンダースコアで始まり、その後に大文字が続くすべての名前は、実装用に予約されています。つまり、コンパイラ、標準ライブラリ、およびOSです。これにより、ユーザーが「in」と呼ばれるマクロまたはグローバルを定義した場合、それは__inを使用するため、std libを壊さず、ユーザーおよびサードパーティライブラリはそのような名前で何も定義してはならないため、sal.hの作成者は正常に動作し、予約済みの名前を使用していません。

表示している二重アンダースコア識別子は、パラメーターが関数に値を渡すためにのみ使用されるのか、データを戻すためにも使用されるのか(つまり、関数に設定されるポインターまたは参照パラメーター)を示すMicrosoftの方法です。両方とも。Icmは、ネット上に表示されるすべてのコードにそれらが含まれていることに驚いています。Windowsコードのみを表示する必要があります。おそらく、MSDNのみを表示する必要がありますか?

于 2012-06-02T12:56:10.013 に答える