9.28 読み出し/書き込み定数

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

"C++:read/write" リンケージを使用する必要があるのは、--apcs /rwpi でコンパイルされるコードだけです。このオプションを使用して既存のコードを再コンパイルする場合は、動的に初期化されたり、可変メンバを保持している外部定数に対するリンケージの指定を変更する必要があります。
--apcs /rwpi オプションを使用して C++ をコンパイルすると、生成されたコードは ISO C++ 標準に準拠しなくなります。この例の宣言では、x が読み出し専用セグメント内にあることが想定されています。
extern const T x;
extern "C++" const T x;
extern "C" const T x;
定数ではユーザ定義コンストラクタを含む x を動的に初期化することはできず、また T が可変メンバを保持することもできません。この例の新しいリンケージ指定では、x が定数で初期化されたかどうかにかかわらず、読み出し/書き込みセグメント内にあることを宣言しています。この場合は x を動的に初期化することが可能であり、T は可変メンバを保持できます。xyz を別のファイル内で定義する場合も、同じリンケージを指定する必要があります。
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;           // 読み出し/書き込みセグメントに配置
    };
}
定数オブジェクトは、他のリンケージで再宣言することはできません。以下の例のコードは、コンパイルエラーを生成します。
extern "C++"  const T x;
extern "C++:read/write"  const T x; /* エラー */

C にはリンケージを指定できないため、C++ で宣言された const オブジェクトを extern "C++:read/write" として C 言語で記述されたソースから使用することはできません。
関連する参考文書
8.6 --apcs=qualifier...qualifier
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.