読み出し/書き込み定数

外部定数にリンケージを指定すると、定数を動的に初期化したり、定数に可変メンバを使用したりできます。

Note

"C++:read/write" リンケージを使用する必要があるのは、--apcs /rwpi でコンパイルされるコードだけです。このオプションを使用して既存のコードを再コンパイルする場合は、動的に初期化されたり、可変メンバを保持している外部定数に対するリンケージの指定を変更する必要があります。

--apcs /rwpi オプションを使用して C++ をコンパイルすると、生成されたコードは ISO C++ 標準に準拠しなくなります。Example 2 の宣言では、x が読み出し専用セグメント内にあることが想定されています。

Example 2. 外部アクセス

extern const T x;
extern "C++" const T x;
extern "C" const T x;

定数ではユーザ定義コンストラクタを含む x を動的に初期化することはできず、また T が可変メンバを保持することもできません。Example 3 の新しいリンケージ指定では、x が定数で初期化されたかどうかにかかわらず、読み出し/書き込みセグメント内にあることを宣言しています。この場合は x を動的に初期化することが可能であり、T は可変メンバを保持できます。xyz を別のファイル内で定義する場合も、同じリンケージを指定する必要があります。

Example 3. リンケージ指定

extern const int z;                   /* 読み出し専用セグメントでは  */	
                                      /* 動的に初期化できない    */	
extern "C++:read/write" const int y;  /* 読み出し/書き込みセグメントでは */	
                                      /* 動的に初期化できる */	
extern "C++:read/write"
{	
    const int i=5;                    /* 読み出し専用セグメントに配置した場合、 */	
                                      /* 暗黙的にスタティックとなるため extern にはならない */	
    extern const T x=6;               /* 読み出し/書き込みセグメントに配置 */	
    struct S
    {	
        static const T T x;           /* 読み出し/書き込みセグメントに配置 */	
    };	
}

定数オブジェクトは、他のリンケージで再宣言することはできません。Example 4 のコードではコンパイルエラーが発生します。

Example 4. コンパイルエラー

extern "C++"  const T x;
extern "C++:read/write"  const T x; /* エラー */

Note

C にはリンケージを指定できないため、C++ で宣言された const オブジェクトを extern "C++:read/write" として C 言語で記述されたソースから使用することはできません。

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0491EJ
Non-ConfidentialID081711