C言語で変数の型を自動的に発見する方法はありますか?プログラム内のメカニズムによって、コンパイラのパスを使用して変数を解析し、その型を割り当てたポイントまでのスクリプト?私はこれに関する一般的な提案を探しています。以下は、私が必要とする理由と理由についての背景です。Cコードで変数の型を取得する
OpenMP削減節のセマンティクスを変更したいと思います。この時点では、ソースコード内の節を(スクリプトを介して)関数の呼び出しで置き換えるのが最も簡単なようです。次に、私が望む削減セマンティクスを実装する関数を定義することができます。
以前、私は(例えば)enum reduction_op {PLUS, MINUS, TIMES, AND,
OR, BIT_AND, BIT_OR, BIT_XOR, /* ... */};
そしてmy_reduction
が署名
void my_reduction(enum reduction_op op, void * var, size_t size);
を持っている必要があり、
my_reduction(PLUS, &x, sizeof(x));
#pragma omp parallel for
:たとえば、私のスクリプトは、このにこの
#pragma omp parallel for reduction(+:x)
を変換します
他の中でもmy_reduction
は、プログラマが本来意図していた減算変数に加算演算を適用する必要があります。しかし、私の機能はこれを正しく行う方法を知ることができません。特に、操作の種類()、元の変数(var
)の位置、および変数の型のサイズを知っていますが、変数の型自体はわかりません。特に、var
に整数型または浮動小数点型があるかどうかはわかりません。低レベルのPOVから、これらの2つのクラスの型に対する加算演算は全く異なります。
GCCがサポートしている非標準オペレータtypeof
だけが、sizeofの働きをして、ある種の変数を返すなら、この問題を簡単に解決できます。しかし、typeofはsizeofのようなものではありません。l値の宣言でしか使用できません。
コンパイラは、実行可能コードの生成が完了する前に、明らかにxの型を知っています。これにより、私は何とかx
の型を取得してスクリプトに渡してから、変更されたソースコードをコンパイルするために、GCCのパーサーを何とか利用できるかどうか疑問に思っています。その後、十分に逆参照し、オペレータを適用する前に適切にキャストでき
enum var_type { INT8, UINT8, INT16, UINT16, /* ,..., */ FLOAT, DOUBLE};
void my_reduction(enum reduction_op op, void * var, enum var_type vtype);
そしてmy_reduction
を宣言するのは簡単だろう。
ご覧のとおり、Cで「ディスパッチング」メカニズムを作成しようとしています。なぜ、C++のオーバーロードを使用しないのですか?私のプロジェクトでは、Cで書かれたレガシーソースコードで作業するように制約されているので、スクリプトでコードを自動的に変更できますが、別の言語に書き換えることはできません。
ありがとうございます!
いくつかのツール/スクリプトでソースコードを後処理するのはどうですか?例えば。 clangで解析し、型を見つけ、型固有のコードを挿入/調整し、コンパイルしますか? –
ありがとう、アレックス。それは正しい方向に進んでいるように思えます。 –
私は、ユーザー定義リダクションが3.1または4.0標準の一部であると、どこか読んでいます。 Hm 3.1は次のように言っています: 'reduction({operator | intrinsic_procedure_name}:list)' ..n試みたのはintrinsic_procedure_nameです。あなたのタイプ検出を部分的に解決するに過ぎません。 – Bort