14

C++ では、文字列変数から C++ コードを実行できます。Javascript のように:

var theInstructions = "alert('Hello World'); var x = 100";

var F=new Function (theInstructions);

return(F());

C++ の Javascript のような非常によく似たものが必要です。どうやってするか ?

4

6 に答える 6

12

いいえ、C++ は静的型付けで、ネイティブ バイナリ言語にコンパイルされます。

LLVM JIT コンパイルを使用することもできますが、ランタイムを中断することなくコンパイルおよびリンクします。実行できるはずですが、C ++のドメインにはありません。

C++ でスクリプト エンジンが必要な場合は、たとえば JS を使用できます。これは、群を抜いて最速の動的ソリューションです。Lua、Python、Ruby も問題ありませんが、通常は遅くなります。これは、スクリプトを作成するためだけに使用していることを考えると、ひどいことではないかもしれません。

たとえば、Qt では次のようなことができます。

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QScriptEngine engine;
    QScriptValue value = engine.evaluate("var a = 20; var b = 30; a + b");

    cout << value.toNumber();

    return a.exec();
}

そして、あなたは50を得るでしょう;)

于 2013-04-05T19:08:05.790 に答える
10

コードをコンパイルするには、コンパイラを呼び出す必要があります。さらに、関数宣言で文字列をラップするコードを生成する必要があります。最後に、何らかの方法でコンパイル済みコードをロードする必要があります。

私がこれをしていたら(私はしません)、私は次のことをします:

  1. コードの周りに標準ラッパー関数ヘッダーを連結します
  2. コマンドライン ( system()) からコンパイラを呼び出して、共有ライブラリを構築します ( .dllWindows または.soLinux 上)。
  3. 共有ライブラリをロードして関数をマップする
  4. 関数を呼び出す

ほとんどの場合、これは実際には C コードの書き方ではありません。

于 2013-04-05T19:07:14.563 に答える
6

直接、いいえ。でも君ならできる:

  • その文字列をファイルに書き込みます。
  • コンパイラを呼び出して、そのファイルをコンパイルします。
  • 結果のバイナリを実行します。
于 2013-04-05T19:06:31.590 に答える
5

C++ はコンパイル済み言語です。C++ ソースを実行可能ファイルであるマシン コードにコンパイルします。それがロードされ、実行されます。コンパイラは C++ について認識しています (そして、すべてのライブラリ ヘッダーが利用可能です)。そのため、文字列を実行可能コードに変換することはできません。確かに、たまたまマシンコード命令が含まれている場合、文字列の内容を実行できますが、それは一般的に非常に悪い考えです...

これは、この種のランタイム コンパイルを実行できないという意味ではありません。C++ で不可能なことはほとんどありません。しかし、あなたがやっていることは、C++ コンパイラ オブジェクトを実装することです...本当にこれが必要かどうかを判断する前に、他のコンパイラ プロジェクトを見てください。

インタープリター型言語はこれを簡単に行うことができます - 既にプログラムを実行しているインタープリターに文字列を渡すだけです。彼らは、他の点でこの種の柔軟性にお金を払っています。

于 2013-04-05T19:06:58.973 に答える
0

短い答えはノーです。ハッカーは野外活動をします。ただし、Windows の IActiveScriptSite インターフェイスを使用して Java/VB スクリプトを利用することはできます。Google IActiveScriptSite には、ウェブ上に多数の例があります。または、私が現在行っていることを実行して、独自のスクリプト エンジンを展開することもできます。

于 2013-04-05T19:07:14.813 に答える