Мой вопрос: у меня длинная строка, которая содержит компилируемый код на C++.
В стандарте C++ 11 не упоминается какая-либо функция, способная это сделать (скомпилируйте код C++ в некоторой строке). И я не знаю библиотеки (кроме, возможно, libclang, но я не знаю, смогу ли она скомпилировать строку), способную это сделать.
На самом деле компилятору C++ практически необходимо сделать много optimizations (если вы хотите, чтобы код работал не слишком медленно), поэтому потратит значительное время (относительно скорости компьютера, например, несколько десятых секунд даже для небольшой исходный код на C++) для компиляции сгенерированного кода на C++. И сильно templatized C++-код может занять много времени (даже бесконечное количество в патологических случаях, начиная с C++ templates are accidentally Turing Complete) для компиляции.
Практически говоря, вы не получаете преимущества, чтобы не писать исходный файл на C++. Некоторые компиляторы (например, GCC на Linux с g++ -x c++ /dev/stdin
) могут компилировать код C++ со своего стандартного ввода, поэтому вы можете использовать (в системах POSIX) popen для их комбинирования.
Просто написать C++ код в какой-нибудь временный C++ исходный файл (возможно, в какой-то tmpfs файловой системы, если вы хотите, чтобы избежать диск IO) или, возможно, pipe(7) или fifo(7) ... и вилкой сборник. В системах Linux и Posix вы можете скомпилировать (например, с g++ -Wall -fPIC -O -shared /tmp/temporary1234.cc -o /tmp/temporary1234.so
) этот код в «плагин» или общий объект, который может быть позже у вашей основной программы dlopen
Если вы создаете код на C++, вы можете рассмотреть возможность использования (вместо генерируя исходный код C++, затем компилируя его), некоторая Just-In-Time compilation библиотека, подобная gccjit, LLVM, libjit, lightning, asmjit и т. д. Затем вы создадите некоторое внутреннее представление (специфичное для библиотеки JIT!) кода AST.
Вкратце: нет, нет встроенного компилятора в среде выполнения C++. Вы можете, конечно, написать код, который приводит к некоторому выходу из вашей программы, скомпилированному в другую программу, запустив компилятор над этим выходом [и, по крайней мере, некоторые компиляторы могут сделать это с помощью 'stdout' из вашей программы в качестве входных данных для компилятора, поэтому вам действительно не нужно создавать файл как таковой] –
Aww .. спасибо за ответ ... Моя реальная цель - когда моя программа (с использованием java) должна читать либо в C++ исходных кодов Java, и проверить, исходный код ввода компилируется. Поскольку я не могу сделать это, я думаю, мне нужно отказаться от этой функции :(.. Спасибо за ваше понимание. – user3188291
Вы можете перенаправить строку в 'gcc' [через командную строку ...] (http: // stackoverflow .com/questions/1003644/is-it-possible-to-get-gcc-to-read-from-a-pipe) (используя вызов 'system') – scohe001