выполнить C++ из переменной String

в C++ можно выполнить код C++ из строковой переменной. Как в Javascript:

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

var F=new Function (theInstructions);

return(F());

Я хочу что-то очень похожее на Javascript в C++. Как это сделать?

Ответ 1

Вам нужно будет вызвать компилятор для компиляции кода. Кроме того, вам нужно будет сгенерировать некоторый код, чтобы обернуть строку в объявлении функции. Наконец, вам тогда нужно будет загрузить скомпилированный код.

Если бы я делал это (чего бы я не хотел), я бы:

  1. Объединение стандартного заголовка функции обертки вокруг кода
  2. Вызовите компилятор через командную строку (system()) для создания общей библиотеки (.dll в Windows или .so на linux)
  3. Загрузите общую библиотеку и сопоставьте функцию
  4. Вызовите функцию

На самом деле это не так, как вы хотите писать код C в большинстве случаев.

Ответ 2

Нет, 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;)

Ответ 3

Прямо, нет. Но вы можете:

  • напишите эту строку в файл.
  • вызывать компилятор и компилировать этот файл.
  • выполнить результирующий двоичный файл.

Ответ 4

C++ - это скомпилированный язык. Вы скомпилируете источник C++ в машинный код, исполняемый файл. Это загружается и выполняется. Компилятор знает о C++ (и имеет все имеющиеся заголовки библиотеки). Исполняемый файл не работает, и поэтому он не может превратить строку в исполняемый код. Вы действительно можете выполнить содержимое строки, если она содержит инструкции машинного кода, но это, как правило, очень плохая идея...

Это не означает, что было бы невозможно выполнить такую компиляцию во время выполнения. Очень мало (если, действительно, ничего) невозможно в C++. Но то, что вы будете делать, будет реализовывать объект компилятора C++... посмотрите на другие проекты компилятора, прежде чем решите, что вы действительно этого хотите.

Интерпретированные языки могут сделать это с легкостью - им просто нужно передать строку интерпретатору, который уже запускает программу. Они платят за такую гибкость в других отношениях.

Ответ 5

Короткий ответ - нет. У хакеров был бы полевой день. Однако вы можете использовать интерфейс Windows IActiveScriptSite для использования сценария Java/VB. Google IActiveScriptSite, есть множество примеров в Интернете. Или вы можете делать то, что я сейчас делаю, перевернуть свой собственный движок скриптов.