@DOBUTSU

Как сделать динамическую подгрузку кода?

#include <iostream>
#include <fstream>
#include <string>

#define defineCode(stringCode) stringCode

bool boolCreateHandler(void) {
    std::ifstream ifstreamFile("test.html");
    std::string stringLine = "";

    bool boolCode = false;

    if (ifstreamFile.is_open() == true) {
        while(std::getline(ifstreamFile, stringLine)) {
            if (stringLine.find("<?c++") != std::string::npos) {
                boolCode = true;
                stringLine.erase(stringLine.find("<?c++"), stringLine.find("<?c++") + 5);
            }

            if (stringLine.find("?>") != std::string::npos) {
                boolCode = false;
                stringLine.erase(stringLine.find("?>"), stringLine.find("?>") + 1);
            }

            if (boolCode == true) {
                defineCode(stringLine); // ne work :(
                defineCode(std::cout << 13 << std::endl); // work
            } else if (boolCode == false) {
                std::cout << stringLine << std::endl;
            }
        } return true;
    } return false;
}

int main(void) {
    std::cout << boolCreateHandler() << std::endl;
    return 0;
}
  • Вопрос задан
  • 110 просмотров
Пригласить эксперта
Ответы на вопрос 3
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
C++ - компилируемый язык. Соответственно, вы содержимое строки в нем никак не исполните, только если не напишите свой интерпретатор или не скомпилируете код в строке как-то подобно JIT. Можно подключить библиотеку с какой-нибудь Lua и код на Lua исполнять. Или подгружать в специально выделенную память скомпилированный заранее (или библиотекой) машинный код и передавать управление ему (но это надо знать ассемблер, про страницы памяти, API операционной системы и все такое. Это очень сложно). Вообще, C++ - не лучший выбор для динамической подгрузки кода.

defineCode(std::cout << 13 << std::endl); // work
Работает, потому что тут макрос просто подставляет код в скобках вместо себя и он компилируется и выполняется.

defineCode(stringLine); заменяется просто на stringLine, что есть бессмысленное выражение, вырезаемое еще на этапе компиляции.
Ответ написан
Комментировать
@dima20155
you don't choose c++. It chooses you
Мне кажется, вам лучше сформулировать более конкретно ваши задачи, возможно, уже есть готовое решение для вас.
Помимо перечисленного выше, есть интерпретаторы языка С++ (которые, конечно, так себе, но попробовать их можно), а возможно, вам для вашей цели может быть полезным grpc.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Вот этот дефайн коде. Это что тут бывает?

defineCode(stringLine);

Если это можно свести к конечному (небольшому) числу вариантов - то можно собрать ну 5-10 библиотеки (*.dll) и подгружать ту логику которая нужна в зависимости от conditions.

И вообще динамический код считается угрозой №1 с точки зрения антивирусов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы