Если вы на самом деле пытаетесь «оценить» исходный код C ++ в работающем приложении C ++, то по сути нет - это не особенность, определяемая языком.
Есть интерпретаторы для подмножеств C ++ (например, CInt, Ch и UnderC) - они могут запускать вашу программу на C ++, если она относительно проста. В качестве альтернативы, некоторые могут быть встроены в скомпилированную программу C ++, чтобы позволить некоторую оценку исходного кода во время выполнения, но с ограниченным доступом и возможностью изменения предварительно скомпилированного кода и его переменных.
Для работающей программы также возможно вызвать компилятор и динамически загрузить / связать результирующую библиотеку, но это очень необычная практика и не без проблем с производительностью, безопасностью и совместимостью:
- создание нового процесса для компилятора, компиляция и компоновка - это относительно ресурсоемкая и медленная операция, но как только библиотека скомпонована, новый код может быть выполнен с нормальной скоростью вызова функции вне линии
- обычные проблемы с выполнением внешнего процесса
- гарантирует, что путь и имя исполняемого файла компилятора не могут быть изменены вредоносными входами в программу
- что вредоносное ПО не заменяет и не заражает компилятор
- исходный код «на лету» не содержит таких операторов, как
system()
, exec()
, unlink()
вызовы, злоупотребление сетевым подключением, жевание необоснованных ЦП / памяти / дескрипторов и т. Д.
- предварительно скомпилированная программа C ++ не может быть изменена или легко / глубоко прощупана вновь связанным кодом, поэтому основные механизмы для нового поведения должны быть уже разработаны для предварительно скомпилированного приложения: ожидания для вновь доступных переменных , функции и фабричные методы / виртуальная диспетчеризация.
Если вам действительно нужно что-то более ограниченное, например, способность оценивать математические выражения или логические предикаты , возможно, выраженные в стиле исходного кода C ++, возможно, чтение или установка некоторых из ваших значений, тогда различные более ограниченные и специализированные библиотеки и встроенные интерпретации доступны. Есть даже библиотеки для создания таких парсеров, такие как библиотека Boost Spirit.
Наконец, в приложение C ++ могут быть встроены переводчики для других языков - Lua, Ruby, Python, Perl, TCL и т. Д., Которые поддерживают различные подходы к взаимодействию и безопасности.