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

dmd.attrib

さまざまな属性の宣言を定義する。
「属性」という用語は、単一の宣言よりも広い範囲に適用できるものを指す。 その中には以下のようなものがある。
  • 整列 (align(8))
  • ユーザー定義属性 (@UDA)
  • 関数属性 (@safe)
  • ストレージクラス (static__gshared)
  • ミックスイン宣言 (mixin("int x;"))
  • 条件付きコンパイル (static ifstatic foreach)
  • リンケージ (extern(C))
  • 匿名構造体 / 匿名共用体
  • 保護 (private,public)
  • 非推奨の宣言 (@deprecated)
to protect保護
Authors:
xml-ph-0000@deepl.internalxml-ph-0000@deepl.internalソース xml-ph-0000@deepl.internal

ソースattrib.d

ドキュメント https://dlang.org/phobos/dmd_attrib.html 対象範囲 https://codecov.io/gh/dlang/dmd/src/master/src/dmd/attrib.d

対象範囲 https://codecov.io/gh/dlang/dmd/src/master/src/dmd/attrib.d

abstract class AttribDeclaration: dmd.dsymbol.Dsymbol;
抽象属性は、ストレージクラス(StorageClassDeclaration)、 リンケージ(LinkageDeclaration)などの共通の祖先として使用される Dsymbolに適用される。
Dsymbols* decl;
この AttribDeclaration に影響を受ける Dsymbol
static Scope* createNewScope(Scope* sc, StorageClass stc, LINK linkage, CPPMANGLE cppmangle, Visibility visibility, int explicitVisibility, AlignDeclaration aligndecl, PragmaDeclaration inlining);
1つ以上の指定された属性が sc と異なる場合、新しいスコープを作成する。 返されたスコープが sc と異なる場合、呼び出し側は 使用後にスコープを削除すべきである。
Scope* newScope(Scope* sc);
メンバー用のスコープを供給するフックポイント。 addMember、setScope、importAll、semantic、semantic2、semantic3はこれを使用する。
final void addObjcSymbols(ClassDeclarations* classes, ClassDeclarations* categories);
class StorageClassDeclaration: dmd.attrib.AttribDeclaration;
Dsymbolsに適用されるストレージクラス、例えばconst int i;
class DeprecatedDeclaration: dmd.attrib.StorageClassDeclaration;
Dsymbolsに追加のメッセージを適用した廃止、 例えばdeprecated("Superseeded by foo") int bar; 。 (deprecated int bar; は現在、 STC.deprecated_というStorageClassDeclarationとして表されていることに
deprecated(<msg>) <decl...>
Expression msg;
廃止メッセージの
const(char)* msgstr;
キャッシュされた文字列表現の msg
Scope* newScope(Scope* sc);
STC.deprecated_Scope.depdecl を設定して新しいスコープを提供する
呼び出し StorageClassDeclaration.newScope(オーバーライドする関数内で呼び出したりコピーしたりする必要がある )し、xml-ph-0000@deepl.internalのdepdeclを設定する。 newScope)、次にScope のdepdeclを設定する。
Returns: 常に新しいスコープを使用し、xml-ph-0000@deepl.internal のメンバー用とする。
常に新しいスコープを使用し、DeprecatedDeclaration のメンバに使用する。
class LinkDeclaration: dmd.attrib.AttribDeclaration;
Dsymbolsに適用されるリンケージ属性、例えばextern(C) void foo()
extern(<linkage>) <decl...>
LINK linkage;
明示的に設定されるか、default_
class CPPMangleDeclaration: dmd.attrib.AttribDeclaration;
外部集約がC++の構造体またはクラスとしてマングルされるべきかどうかを宣言する属性。 例えば、extern(C++, struct) class C { ... } 。 これは、MSVCターゲットで正しい名前マングリングを行うために必要である。 詳細はcppmanglewin.dを参照のこと。
extern(C++, <cppmangle>) <decl...>
class CPPNamespaceDeclaration: dmd.attrib.AttribDeclaration;
extern(C++) ネームスペース属性を表すノード
シンボルを名前空間のメンバとして宣言するには2つの方法がある。NspaceCPPNamespaceDeclaration。 前者はシンボルにスコープを作成し、同時に親スコープにそれを注入する。 後者はこのクラスであり、意味的な含意はなく、 マングリングのみに使用される。 さらに、このクラスを使用すると、予約識別子 (Dキーワード)を名前空間で使用できる。
A CPPNamespaceDeclarationは、Identifier (すでに解決済み)またはExpression (CTFE化され、TupleExp (追加のノードを作成できる)または CPPNamespaceDeclarationノードを作成できるStringExp のいずれかである。
このクラスは、Nspace と同様に、名前空間の識別子部分の1つにのみ一致する。 名前空間"foo::bar" の場合、 が に設定され、 フィールドが を指す CPPNamespaceDeclarationident"bar" に設定され、namespace フィールドが CPPNamespaceDeclarationident"foo" に設定する。
Expression exp;
CTFE可能な式、TupleExp または に解決する。StringExp
Scope* newScope(Scope* sc);
Returns: 親スコープのコピーで、xml-ph-0000@deepl.internal をxml-ph-0001@deepl.internal、C++のリンクとして
親スコープのコピーで、thisnamespace 、C++のリンク
class VisibilityDeclaration: dmd.attrib.AttribDeclaration;
Dsymbolsの可視性宣言、例えばpublic int i;
<visibility> <decl...> またはpackage(<pkg_identifiers>) <decl...> pkg_identifiers !is null
Visibility visibility;
可視性
Identifier[] pkg_identifiers;
package(foo.bar) の識別子または null
@safe this(const ref Loc loc, Visibility visibility, Dsymbols* decl);
Parameters: 属性トークンのソースロケーション
Loc loc 属性トークンのソースロケーション
Visibility visibility 可視性属性データ
Dsymbols* decl この可視性属性の影響を受ける可視性属性データ宣言
this(const ref Loc loc, Identifier[] pkg_identifiers, Dsymbols* decl);
Parameters:
Loc loc 属性トークンのソース位置
Identifier[] pkg_identifiers 修飾されたパッケージ名の識別子リスト
Dsymbols* decl この可視性属性の影響を受ける宣言
class AlignDeclaration: dmd.attrib.AttribDeclaration;
集約、メンバ、変数に対するアラインメント属性。
align(<ealign>) <decl...> または がnullの場合、ealign align <decl...>
Expressions* exps;
希望する配置を生成する式、
structalign_t salign;
最も大きな値が実際の配置を決定する。 実際の配置は、ealignの値に設定されるか、ealign が null の場合はデフォルト値に設定されるまで、 不明(またはエラーが発生)となる。
class AnonDeclaration: dmd.attrib.AttribDeclaration;
匿名の構造体/共用体(isunion で定義)
bool isunion;
共用体であるかどうか
int sem;
成功した場合 1
uint anonoffset;
匿名構造体のオフセット
uint anonstructsize;
匿名構造体のサイズ
uint anonalignsize;
アラインメント目的の匿名構造体のサイズ
class PragmaDeclaration: dmd.attrib.AttribDeclaration;
Dsymbolsに適用されたPragma、例えばpragma(inline, true) void foo 、 ただしpragma(msg, "hello"); のようなPragmaStatementは適用されない。
pragma(,)
Expressions* args;
このプラグマのパラメータ
class ConditionalDeclaration: dmd.attrib.AttribDeclaration;
条件付きコンパイル宣言で、version /debug で使用され、static if に特化している。
{ } else { }
Condition condition;
declまたはelsedeclが適用されるかどうかを判断する条件
Dsymbols* elsedecl;
elseブロック用のDSymbolの配列
class StaticIfDeclaration: dmd.attrib.ConditionalDeclaration;
` { static if () { } else { } }`
ScopeDsymbol scopesym;
シンボル(モジュールなど)を囲む記号。ここにシンボルが挿入される
Dsymbols* include(Scope* sc);
他の AttribDeclaration のサブクラスとは異なり、include() の呼び出しには addMember および setScope フェーズの完了が必要である。
class StaticForeachDeclaration: dmd.attrib.AttribDeclaration;
静的foreachは宣言スコープで、例えば: static foreach (i; [0, 1, 2]){ }
StaticForeach sfe;
static foreach の展開ロジックを含み
ScopeDsymbol scopesym;
キャッシュされた囲みスコープ(static if 宣言を模倣)
bool onStack;
include 複数回呼び出すことができるが、 は 最大でも1回だけ展開されるべきである。これは、最初の呼び出しの結果をキャッシュすることで実現される。 と の両方が必要である。なぜなら、 は の有効な値であるからだ。static foreach cached cache null cache
class ForwardingAttribDeclaration: dmd.attrib.AttribDeclaration;
ローカルシンボルテーブルに foreach インデックス変数を格納する宣言の集合。 他のシンボルは、別のスコープに転送される。 例えば、
static foreach (i; 0 .. 10) // 異なるインデックス用のループ変数は衝突しない。 { // この本体は10個のForwardingAttribDeclarationに展開され、i はストレージクラスSTC.local ミックスイン("列挙型x" ~ to!string(i) ~ " = i"); // OK、現在のループ変数にアクセスできる }
static foreach (i; 0.. 10) { pragma(msg, mixin("x" ~ to!string(i))); // OK、10個のシンボルはすべてグローバルスコープに転送されているため、すべて可視である }
static assert (!is(typeof(i))); // ループインデックス変数は、static foreach ループの外からは可視ではない
StaticForeachDeclaration は、 その本体の展開ごとに ForwardingAttribDeclaration を1つ生成する。 ForwardingAttribDeclaration の AST には、`static foreach variables and the respective copy of the static foreach` 本体の両方が含まれる。この機能は、 ForwardingScopeDsymbol を生成された宣言の親シンボルとして使用することで実現される。
Scope* newScope(Scope* sc);
メンバの親シンボルとしてForwardingScopeDsymbolを使用する。
class MixinDeclaration: dmd.attrib.AttribDeclaration;
ミックスイン宣言、例えば: mixin("int x"); https://dlang.org/spec/module.html#mixin-declaration
https://dlang.org/spec/module.html#mixin-declarationhttps://dlang.org/spec/module.html#mixin-declaration
class UserAttributeDeclaration: dmd.attrib.AttribDeclaration;
ユーザー定義属性は次のようになる。 @foo(args, ...) @(args, ...)
ユーザー定義の属性は以下のようになる。 @foo(args, ...) @(args, ...)
static bool isGNUABITag(Expression e);
提供された式がcore.attribute.gnuAbiTagを参照しているかどうかを確認する。
これは、式に対してセマンティックが実行された後に呼び出される。 UDAに対するセマンティックはsemantic2で実行される(dmd.semantic2 を参照)。
Parameters:
Expression e チェックする式(通常はUserAttributeDeclaration.atts から)
Returns: その式がコンパイラが認識するものを参照しているかどうか
true 式がコンパイラが認識するgnuAbiTag
static void checkGNUABITag(Dsymbol sym, LINK linkage);
シンボルのセマンティックから呼び出され、gnuAbiTag UDA が適用できるかどうかを確認する
UDAがこのシンボルで機能しない場合は、直接エラーを発生させる
Parameters:
Dsymbol sym シンボルをチェックするgnuAbiTag
LINK linkage シンボルのリンク(Declaration.link または sc.link)を
bool isCoreUda(Dsymbol sym, Identifier ident);
指定されたシンボルがtrue で宣言されたシンボルであり、core.attribute で指定された識別子を持つ場合、 を返す。
これは、シンボルがUDAとしてcore.attribute で宣言されているかどうかを判断するために使用される。
Parameters:
Dsymbol sym チェックするシンボル
Identifier ident 期待されるUDAの名称を
int foreachUdaNoSemantic(Dsymbol sym, int delegate(Expression) dg);
意味分析を行わずに、指定されたシンボルに添付されたUDAを反復する。
意味分析がまだ進行中の場合は、foreachUda の代わりにこの関数を使用する。 symまだ進行中である場合、
Parameters:
Dsymbol sym シンボルからUDAを取得する
int delegate(Expression) dg 各UDAに対して1回呼び出される
Returns:
もし dg!= 0 を返す場合は、繰り返しを中止し、その値を返します。 それ以外の場合は、0 を返します。
0email0email
bool isEnumAttribute(Expression e, Identifier id);
Returns: 指定された式がxml-ph-0000@deepl.internalという名前の列挙型である場合はtrueを返す。
指定された式がcore.attribute という名前の列挙型である場合はtrueを返す。 id
)