英語版
このページの英語版を見る
dmd.attrib
さまざまな属性の宣言を定義する。
「属性」という用語は、単一の宣言よりも広い範囲に適用できるものを指す。
その中には以下のようなものがある。
to protect保護- 整列 (align(8))
- ユーザー定義属性 (@UDA)
- 関数属性 (@safe)
- ストレージクラス (static 、__gshared)
- ミックスイン宣言 (mixin("int x;"))
- 条件付きコンパイル (static if 、static foreach)
- リンケージ (extern(C))
- 匿名構造体 / 匿名共用体
- 保護 (private,public)
- 非推奨の宣言 (@deprecated)
Authors:
xml-ph-0000@deepl.internalxml-ph-0000@deepl.internalLicense:
ソース
xml-ph-0000@deepl.internal ソース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
, StorageClassstc
, LINKlinkage
, CPPMANGLEcppmangle
, Visibilityvisibility
, intexplicitVisibility
, AlignDeclarationaligndecl
, PragmaDeclarationinlining
); - 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つの方法がある。Nspace と
CPPNamespaceDeclaration
。 前者はシンボルにスコープを作成し、同時に親スコープにそれを注入する。 後者はこのクラスであり、意味的な含意はなく、 マングリングのみに使用される。 さらに、このクラスを使用すると、予約識別子 (Dキーワード)を名前空間で使用できる。 ACPPNamespaceDeclaration
は、Identifier (すでに解決済み)またはExpression (CTFE化され、TupleExp (追加のノードを作成できる)またはCPPNamespaceDeclaration
ノードを作成できるStringExp のいずれかである。 このクラスは、Nspace と同様に、名前空間の識別子部分の1つにのみ一致する。 名前空間"foo::bar" の場合、 が に設定され、 フィールドが を指すCPPNamespaceDeclaration
identが"bar" に設定され、namespace フィールドがCPPNamespaceDeclaration
ident を"foo" に設定する。- Expression
exp
; - CTFE可能な式、TupleExp または に解決する。StringExp
- Scope*
newScope
(Scope*sc
); - Returns: 親スコープのコピーで、xml-ph-0000@deepl.internal をxml-ph-0001@deepl.internal、C++のリンクとして親スコープのコピーで、this をnamespace 、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
, Visibilityvisibility
, 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
class
UserAttributeDeclaration
: dmd.attrib.AttribDeclaration;
ユーザー定義の属性は以下のようになる。
@foo(args, ...)
@(args, ...)
- static bool
isGNUABITag
(Expressione
); - 提供された式がcore.attribute.gnuAbiTagを参照しているかどうかを確認する。これは、式に対してセマンティックが実行された後に呼び出される。 UDAに対するセマンティックはsemantic2で実行される(dmd.semantic2 を参照)。Parameters:
Expression e
チェックする式(通常はUserAttributeDeclaration.atts から) Returns: その式がコンパイラが認識するものを参照しているかどうかtrue 式がコンパイラが認識するgnuAbiTag - static void
checkGNUABITag
(Dsymbolsym
, LINKlinkage
); - シンボルのセマンティックから呼び出され、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 を返します。bool
isEnumAttribute
(Expression e
, Identifier id
);
Returns: 指定された式がxml-ph-0000@deepl.internalという名前の列挙型である場合はtrueを返す。
指定された式がcore.attribute という名前の列挙型である場合はtrueを返す。
id
Copyright © 1999-2024 by the D Language Foundation
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.109.1
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku