英語版
このページの英語版を見る

core.attribute

このモジュールには、ランタイムで使用されるUDA(ユーザー定義属性)または コンパイラで認識される特別なUDAが含まれている。
チートシート
Attribute NameLinkageDescription
gnuAbiTagC++ C++シンボルにABIタグを宣言する。
mustuse 構造体または共用体の型の値が破棄されないようにする。
optionalObjective-C Objective-Cインターフェイスメソッドをオプションにする。
selectorObjective-C Objective-C セレクタをメソッドに追加する。
weak グローバルシンボルを弱いリンクで発行することを指定する。
Authors:
Jacob Carlborg
enum weak;
この属性を使用して、グローバルシンボルを弱連結で発行するように指定する。 これは主に、ユーザーコードによってオーバーライドされる可能性のあるライブラリ関数を定義する際に役立つが、共有変数や 静的変数にも使用できる。
オーバーライドするシンボルは、weakシンボルと同じ型でなければならない。 さらに、変数を指定する場合は、weakシンボルと同じサイズとアラインメントでなければならない。
LLVMマニュアルからの引用:「注釈:弱リンクは、実際には 最適化機能がこの関数の本体を呼び出し元にインライン化することを許可しない。なぜなら、 この関数の定義がプログラム内の最終的な定義であるか、あるいはより強い定義によって上書きされるか どうかを、最適化機能が知らないからだ 」
この属性は、GNUおよびLLVM Dコンパイラのみに意味がある。Digital Mars Dコンパイラは、デフォルトですべてのシンボルを弱リンクで出力する。
struct selector;
Objective-C セレクタをメソッドに追加するには、この属性を使用する。
これは特別なコンパイラ認識属性であり、いくつかの 要件があり、すべてコンパイラによって強制される。
  • この属性は、Objective-C リンクを持つメソッドまたはコンストラクタにのみ適用できる。 つまり、
    extern(Objective-C)
    として宣言されたクラスまたはインターフェイスのメソッドまたはコンストラクタである。
  • テンプレートであるメソッドまたはコンストラクタにはアタッチできない
  • 文字列内のコロンの数は、メソッドが受け入れる引数の数と一致する必要がある。
  • メソッド宣言では1回しか使用できない
methodメソッド
Examples:
extern (Objective-C)
class NSObject
{
 this() @selector("init");
 static NSObject alloc() @selector("alloc");
 NSObject initWithUTF8String(in char* str) @selector("initWithUTF8String:");
 ObjcObject copyScriptingValue(ObjcObject value, NSString key, NSDictionary properties)
     @selector("copyScriptingValue:forKey:withProperties:");
}
enum optional;
Objective-Cインターフェイスメソッドをオプションにするには、この属性を使用する。
オプションメソッドとは、インターフェースを実装するクラスで実装する必要のないメソッドである。 オプションメソッドを安全に呼び出すには、 受信者がメソッドを実装していることを確認するための実行時チェックを行う必要がある。
これは特別なコンパイラ認識属性であり、いくつかの 要件があり、すべてコンパイラによって強制される。
  • Objective-C リンクを持つメソッドのみにアトリビュートを付加できる 。つまり、インターフェイス内で宣言されたメソッドは、extern (Objective-C)
  • インターフェース内で宣言されたメソッドのみに使用できる
  • メソッド宣言で使用できるのは1回のみ
  • テンプレートであるメソッドにはアタッチできない
methodmethod
Examples:
import core.attribute : optional, selector;

extern (Objective-C):

struct objc_selector;
alias SEL = objc_selector*;

SEL sel_registerName(in char* str);

extern class NSObject
{
    bool respondsToSelector(SEL sel) @selector("respondsToSelector:");
}

interface Foo
{
    @optional void foo() @selector("foo");
    @optional void bar() @selector("bar");
}

class Bar : NSObject
{
    static Bar alloc() @selector("alloc");
    Bar init() @selector("init");

    void bar() @selector("bar")
    {
    }
}

extern (D) void main()
{
    auto bar = Bar.alloc.init;

    if (bar.respondsToSelector(sel_registerName("bar")))
        bar.bar();
}
struct gnuAbiTag;
この属性を使用して、C++シンボルにABIタグを宣言する。
ABI タグは、GNU C++ コンパイラによって導入された属性である。 これは、異なる ABI を持つ以前のバージョンと区別するために、タグ名を組み込むためにシンボルのマングル名を修正する。
これは特別なコンパイラ認識属性であり、いくつかの 要件があり、すべてコンパイラによって強制される。
  • シンボルごとにこのような属性は1つだけ存在できる。
  • この属性は、extern(C++) シンボル(structclassenum 、関数、およびそれらのテンプレート化された対応物)にのみ適用できる。
  • この属性は、C++の名前空間には適用できない。 これは、C++のセマンティクスとの混同を防ぐためである。C++のセマンティクスでは、 名前空間にも適用できる。
  • 文字列引数は、C++の名前のマングリング(文字列化)用の有効な文字のみを含まなければならない。 現在、これには英数字とアンダースコア文字が含まれる。
このユーザー定義属性は推移的ではなく、内部スコープは外部スコープの ABI タグを継承しない。 C++ 宣言を D に変換する方法については、以下の例を参照のこと。 また、このユーザー定義属性の項目は自動的にアルファベット順にソートされることに 留意されたい。 gnuAbiTag("c", "b", "a")表示される @gnuAbiTag("a", "b", "c")
See Also: Itanium ABI 仕様GCC 属性のドキュメント。
ABIABI
Examples:
// ---- foo.cpp
struct [[gnu::abi_tag ("tag1", "tag2")]] Tagged1_2
{
    struct [[gnu::abi_tag ("tag3")]] Tagged3
    {
        [[gnu::abi_tag ("tag4")]]
        int Tagged4 () { return 42; }
    }
}
Tagged1_2 inst1;
// ---- foo.d
@gnuAbiTag("tag1", "tag2") struct Tagged1_2
{
    // 繰り返しに注目する
    @gnuAbiTag("tag1", "tag2", "tag3") struct Tagged3
    {
        @gnuAbiTag("tag1", "tag2", "tag3", "tag4") int Tagged4 ();
    }
}
extern __gshared Tagged1_2 inst1;
enum mustuse;
この属性を使用すると、struct 型またはunion 型の値が破棄されないようにできる。
式の値は、
  • 式が文のトップレベルの式であるか、 カンマ表現の左辺の式であり、
  • その式が代入(=+= など)、 インクリメント(++ )、またはデクリメント(-- )式ではない場合。
struct またはunion 型の宣言に属性が指定されている場合、 @mustuse 属性が指定されている場合、その型の値が破棄される場合はいつでもコンパイラがエラーを発生させます。
現在、 @mustuseは、struct およびunion の宣言に付随する場合のみコンパイラに認識される。 将来的な拡張を可能にするため、 @mustuseclassinterfaceenum 、または関数宣言へのアタッチは 現在禁止されており、コンパイルエラーとなります。それ以外の @mustuse無視されます。
function declaration関数宣言
Examples:
@mustuse struct ErrorCode { int value; }

extern(C) ErrorCode doSomething();

void main()
{
    // エラー: ErrorCode型の値を破棄する
    //doSomething();

    ErrorCode result;
    // OK: 値が変数に代入される
    result = doSomething();

    // OK: キャストで明示的に値を無視できる
    cast(void) doSomething();
}
enum standalone;
この属性を使用すると、共有モジュールコンストラクタが他のモジュールコンストラクタに依存していないことを示すことができる。 これにより、循環モジュールコンストラクタに関するエラーを回避できる。
しかし、安全性を確保するのはユーザーの責任となる。 結果として、モジュールコンストラクタは@system とマークされなければならない。 可能であれば、循環を引き起こしているモジュールコンストラクタをリファクタリングして、独自のモジュールに含めることを推奨する。
これは、shared 静的コンストラクタのみに許可されており、スレッドローカルモジュールコンストラクタには許可されていない。