英語版
このページの英語版を見る
dmd.importc
ImportC "特有のセマンティックルーチンを含む
仕様 C11
Authors:
License:
ソース importc.d
- Type
cAdjustParamType
(Typet
, Scope*sc
); - C11では配列や関数のパラメータは使用できない。 したがって、C11 6.7.6.3のルールに従って、これらの型を調整する。Parameters:
Type t
調整するパラメータ型 Scope* sc
コンテキスト Returns:調整型 - Expression
arrayFuncConv
(Expressione
, Scope*sc
); - C11 6.3.2.1-3 型の配列である式を型へのポインタに変換する。 C11 6.3.2.1-4 関数である式を関数へのポインタに変換する。Parameters:
Expression e
ImportC "式を変換することができる。 Scope* sc
コンテキスト Returns:変換された式 - Expression
fieldLookup
(Expressione
, Scope*sc
, Identifierid
, boolarrow
); - に対してセマンティックを実行する。
e
. 式を実行する。e
は構造体のインスタンスとして評価される。 その構造体のフィールドとしてident を検索する。Parameters:Expression e
は構造体のインスタンスとして評価される。 Scope* sc
コンテキスト Identifier id
その構造体のフィールドの識別子である。 bool arrow
-> が使われた Returns:成功した場合e
.ident 成功しなければErrorExp とメッセージが表示される。 - Expression
carraySemantic
(ArrayExpae
, Scope*sc
); - C11 6.5.2.1-2 E[I] 式に C のセマンティクスを適用する。 E1[E2]は*(E1 + E2)に下げられる。Parameters:
ArrayExp ae
ArrayExpでセマンティクスを実行する Scope* sc
コンテキスト Returns:セマンティックが完了したC式である場合は "式"、そうでない場合は"null"。 - void
addDefaultCInitializer
(VarDeclarationdsym
); - constグローバルシンボルのデフォルトのイニシャライザを決定する。
- Expression
castCallAmbiguity
(Expressione
, Scope*sc
); - キャスト/コールの文法の曖昧さを解決する。Parameters:
Expression e
キャストかもしれない式、コールかもしれない式 Scope* sc
コンテキスト Returns:nullはそのまま、!=nullはASTの書き換えを意味する。 - bool
cFuncEquivalence
(TypeFunctiontf1
, TypeFunctiontf2
); - C11の関数等価性の概念を実装する、 これは、プロトタイプ関数とK+R関数を一致させるものである、 これは、プロトタイプ化された関数がK+R関数と等価であることを意味する。Parameters:
TypeFunction tf1
最初の関数の型 TypeFunction tf2
第二関数の型 Returns:C11が両者を等価とみなした場合、trueが返される - bool
cTypeEquivalence
(Typet1
, Typet2
); - 型はまだマージされていない。 をまだ実行していないからだ。 しかし、t1とt2が同じ型かどうかを確認する必要がある。Parameters:
Type t1
最初の型 Type t2
第二の型 Returns:それらが等価な型であれば真である。 - Dsymbol
handleTagSymbols
(ref Scopesc
, Dsymbols
, Dsymbols2
, ScopeDsymbolsds
); - ImportCタグのシンボルは並列シンボルテーブルに格納される、 これにより、このCコードが動作する:
struct S { a; }; int S; struct S s;
しかし、そのようなタグ・シンボルは比較的少ないので、それはメモリと複雑さの無駄になる。 メモリと複雑さの無駄遣いだ。もう1つの問題は、D側でタグ・シンボルを見つけたい場合だ。 D側では、タグ・シンボルが通常のシンボルと衝突していなければ、両方のテーブルを検索するのではなく、通常の検索でタグ・シンボルを見つけたい。 テーブルの両方をルックアップするのではなく、通常のルックアップでタグ・シンボルを見つけたい。 解決策は、衝突するタグ・シンボルを連想配列に入れることである。 配列に入れることである。 C言語にはモジュールがないので、この連想配列はModuleDeclarationのtagSymTab[]となる。 このアプローチの副作用として、Dコードは通常のシンボルによって隠されたタグ・シンボルにアクセスできない。 にアクセスできないことである。これは理論的な問題である。 これは理論的な問題である。もし誰かがそれをやりたがっているのなら、 残念だ。Cのコードを変更する。 この"関数"は、新しいシンボルの追加に直面したときにシンボル・テーブルを修正する。s
既存のシンボルs2
が存在する場合に、新しいシンボルを追加する際に直面する問題を解決する。 C言語では、タグ・シンボルの前方宣言とプロトタイプ宣言も可能である、 この関数はそれらをマージする。Parameters:Scope sc
コンテキスト Dsymbol s
シンボルテーブルに追加するシンボル Dsymbol s2
既存の宣言 ScopeDsymbol sds
シンボルテーブル Returns:もしsとs2がシンボルテーブルにうまく入れられたら、マージされたシンボルを返す、 競合する場合はnullを返す。 - Dsymbol
handleSymbolRedeclarations
(ref Scopesc
, Dsymbols
, Dsymbols2
, ScopeDsymbolsds
); - ImportCはCの変数、関数、typedefの再宣言を可能にする。 extern int x; int x = 3; そして extern void f(); void f() { }である。 これらをマージしてみる。Parameters:
Scope sc
コンテキスト Dsymbol s
シンボルテーブルに追加するシンボル Dsymbol s2
既存の宣言 ScopeDsymbol sds
シンボルテーブル Returns:もしsとs2がシンボルテーブルにうまく入れられたら、マージされたシンボルを返す、 競合する場合はnullを返す
Copyright © 1999-2024 by the D Language Foundation
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku