2

Dale Rogerson の本「Inside COM」を読みました。第 5 章で、彼は次のように書いています (申し訳ありませんが、私は英語に翻訳しました)。

extern "C"は C リンケージ用です。関数がextern "C"としてマークされている場合、コンパイラは関数の名前を他の名前に変更しません ?CreateInstance@@YAPAUIUncnown@@XZ

私には明らかです。しかし、著者はさらに別extern "C"の場所で使用しており、その理由を説明していません:

#include <objbase.h>

extern "C" 
{
    // {32bb8320-b41b-11cf-a6bb-0080c7b2d682}
    extern const IID IID_IX = 
        {0x32bb8320, 0xb41b, 0x11cf,
        {0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}} ;

    // {32bb8321-b41b-11cf-a6bb-0080c7b2d682}
    extern const IID IID_IY = 
        {0x32bb8321, 0xb41b, 0x11cf,
        {0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}} ;

    // {32bb8322-b41b-11cf-a6bb-0080c7b2d682}
    extern const IID IID_IZ = 
        {0x32bb8322, 0xb41b, 0x11cf,
        {0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}} ;

    // The extern is required to allocate memory for C++ constants.
}

これは関数ではありません...なぜextern "C"この場合に著者が使用したのですか?

よろしく、アンドレイ

4

2 に答える 2

4

そのようなブロックのextern"C"は、ブロック内のすべての宣言にextern"C"を適用するようなものです。それらすべてがCリンケージを使用することを宣言します。

非関数のextern"C"は、関数のextern"C"と同じことを行います。これにより、オブジェクトは名前付けにCセマンティクスを使用し、その他の関連性はすべて使用されます。

詳細については、標準の7.5節のリンケージ仕様[dcl.link]を参照してください(ただし、難しい形式の英語を使用して記述されています)。


言語リンケージは、異なる言語から宣言されたエンティティにアクセスできるようにすることです。これが正確に意味することは、特定の言語とC++の実装次第です。従来、Cでは、関数の記号と呼び出し規約が変更されていました。私が思い出す限り、ほとんどの実装では、非関数について何も違いはありません。extern "C"を使用しない限り、言語仕様では、Cからこれらのエンティティへのアクセスが機能することを期待できるとは規定されていません。

于 2012-11-01T18:12:17.773 に答える