静的整数型定数リンケージの非リテラル化
クラスの定数メンバーの宣言は、Visual C++ では C++ マネージ拡張から変更されています。
static const の整数メンバーは引き続きサポートされていますが、その linkage 属性は変更されています。現在は、literal の整数メンバーに以前の linkage 属性が格納されています。たとえば、次のマネージ拡張クラスを考えます。
public __gc class Constants {
public:
static const int LOG_DEBUG = 4;
};
このコードは、このフィールドに対して次の CIL 基本属性を生成します (literal 属性に注意してください)。
.field public static literal int32
modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier) STANDARD_CLIENT_PRX = int32(0x00000004)
このコードは新しい構文でもコンパイルされます。
public ref class Constants {
public:
static const int LOG_DEBUG = 4;
};
ただし、literal 属性はもう生成されません。したがって、CLR ランタイムからは定数として見なされません。
.field public static int32 modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier) STANDARD_CLIENT_PRX = int32(0x00000004)
以前と同じように中間言語の literal 属性を生成するには、新たにサポートされた literal データ メンバーの宣言を次のように変更する必要があります。
public ref class Constants {
public:
literal int LOG_DEBUG = 4;
};