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

dmd.importc

ImportC "特有のセマンティックルーチンを含む

仕様 C11

Authors:

ソース importc.d

Type cAdjustParamType(Type t, Scope* sc);
C11では配列や関数のパラメータは使用できない。 したがって、C11 6.7.6.3のルールに従って、これらの型を調整する。
Parameters:
Type t 調整するパラメータ型
Scope* sc コンテキスト
Returns:
調整型
Expression arrayFuncConv(Expression e, Scope* sc);
C11 6.3.2.1-3 型の配列である式を型へのポインタに変換する。 C11 6.3.2.1-4 関数である式を関数へのポインタに変換する。
Parameters:
Expression e ImportC "式を変換することができる。
Scope* sc コンテキスト
Returns:
変換された式
Expression fieldLookup(Expression e, Scope* sc, Identifier id, bool arrow);
に対してセマンティックを実行する。 e. 式を実行する。 eは構造体のインスタンスとして評価される。 その構造体のフィールドとしてident を検索する。
Parameters:
Expression e は構造体のインスタンスとして評価される。
Scope* sc コンテキスト
Identifier id その構造体のフィールドの識別子である。
bool arrow -> が使われた
Returns:
成功した場合 e.ident 成功しなければErrorExp とメッセージが表示される。
Expression carraySemantic(ArrayExp ae, 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(VarDeclaration dsym);
constグローバルシンボルのデフォルトのイニシャライザを決定する。
Expression castCallAmbiguity(Expression e, Scope* sc);
キャスト/コールの文法の曖昧さを解決する。
Parameters:
Expression e キャストかもしれない式、コールかもしれない式
Scope* sc コンテキスト
Returns:
nullはそのまま、!=nullはASTの書き換えを意味する。
bool cFuncEquivalence(TypeFunction tf1, TypeFunction tf2);
C11の関数等価性の概念を実装する、 これは、プロトタイプ関数とK+R関数を一致させるものである、 これは、プロトタイプ化された関数がK+R関数と等価であることを意味する。
Parameters:
TypeFunction tf1 最初の関数の型
TypeFunction tf2 第二関数の型
Returns:
C11が両者を等価とみなした場合、trueが返される
bool cTypeEquivalence(Type t1, Type t2);
型はまだマージされていない。 をまだ実行していないからだ。 しかし、t1とt2が同じ型かどうかを確認する必要がある。
Parameters:
Type t1 最初の型
Type t2 第二の型
Returns:
それらが等価な型であれば真である。
Dsymbol handleTagSymbols(ref Scope sc, Dsymbol s, Dsymbol s2, ScopeDsymbol sds);
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 Scope sc, Dsymbol s, Dsymbol s2, ScopeDsymbol sds);
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を返す