2

私は文字列化演算子 (#) を c で読んいました。これは、追加されているものをトークンに貼り付けます。文字列化演算子 (および可能であればマクロ - #define) . コードの次の構造が必要です。

#define #function_name(/*void or non void */)  void function_name(/*void or non void */)

char *function_name;
scanf("%s",function_name);

このようなもの。基本的に、実行時に関数を作成しようとしています。

4

2 に答える 2

4

必要なことを行うハックな方法の 1 つ (そして、その答えに満足できない可能性があります) は次のとおりです。

  1. コンパイルするテキストを作成する
  2. ファイルに保存する
  3. コンパイラを呼び出します(もちろん、「成功」が返されたことを確認してください)
  4. リンカーを呼び出して、DLL (Windows の場合) または共有ライブラリ (*nix の場合) を生成します。
  5. そのライブラリを動的にロードし、関数のエントリ アドレスを取得します
  6. ポインターで関数を呼び出す

C/C++ 言語は、オンザフライでテキストをコードとして実行するメカニズムを提供しません (eval("var i = 0;")たとえば、JavaScript の など)。

于 2012-07-12T15:05:39.650 に答える
0

C は静的にコンパイルされる言語であるため、実行時に関数を作成することは容易ではなく、一般的には可能ですらありません。必要な C コードを .c ファイルに書き出し、システム上でコンパイラを実行してから、オブジェクト ライブラリを動的にロードすることができます。最初の .c ファイルを書き出す過程で、関数に好きな名前を付けることができます。要するに、マクロを使用しても、やりたいことを実行することはできません。そして、今述べた方法を使用することは、大規模なハックです。可能ですが、お勧めできません。

関数の名前を変更するだけの場合、または事前に知っていてプログラムにコンパイルできる関数の限られたセットから選択する場合は、関数ポインターを使用できます。しかし、関数ポインターは変数関数を呼び出すために使用できる静的な名前 (シンボル) を提供するため、これはあなたがやろうとしていることの逆に思えます。

関数ポインターの名前を本当に変更する必要がある場合は、関数ポインターの配列を保持し、文字列マッピングを使用してそれらにインデックスを付けることができます。次に、文字列 (名前) を介してポインターを検索して関数を呼び出します。文字列はもちろん変更可能であるため、関数の「名前」を変更できます。しかし、これは非常に迂遠なルートであり、正直なところ、これを行う正当な理由がわかりません。

最後に、最も有用で正しい解決策は、独自のシンボル テーブルを持つ仮想マシンを実装することです。すでに実装されています。PythonSlangが思い浮かびます。

于 2012-07-12T15:12:55.837 に答える