«Оценить функцию» в C ++ - PullRequest
1 голос
/ 19 мая 2011

Я хочу знать, существует ли в C ++ функция «вычисления», подобная Matlab.

На практике мне нужна функция, которая может интерпретировать строку как командную строку.

спасибо за ответы.

Ответы [ 2 ]

6 голосов
/ 19 мая 2011

Если вы на самом деле пытаетесь «оценить» исходный код C ++ в работающем приложении C ++, то по сути нет - это не особенность, определяемая языком.

Есть интерпретаторы для подмножеств C ++ (например, CInt, Ch и UnderC) - они могут запускать вашу программу на C ++, если она относительно проста. В качестве альтернативы, некоторые могут быть встроены в скомпилированную программу C ++, чтобы позволить некоторую оценку исходного кода во время выполнения, но с ограниченным доступом и возможностью изменения предварительно скомпилированного кода и его переменных.

Для работающей программы также возможно вызвать компилятор и динамически загрузить / связать результирующую библиотеку, но это очень необычная практика и не без проблем с производительностью, безопасностью и совместимостью:

  • создание нового процесса для компилятора, компиляция и компоновка - это относительно ресурсоемкая и медленная операция, но как только библиотека скомпонована, новый код может быть выполнен с нормальной скоростью вызова функции вне линии
  • обычные проблемы с выполнением внешнего процесса
    • гарантирует, что путь и имя исполняемого файла компилятора не могут быть изменены вредоносными входами в программу
    • что вредоносное ПО не заменяет и не заражает компилятор
    • исходный код «на лету» не содержит таких операторов, как system(), exec(), unlink() вызовы, злоупотребление сетевым подключением, жевание необоснованных ЦП / памяти / дескрипторов и т. Д.
  • предварительно скомпилированная программа C ++ не может быть изменена или легко / глубоко прощупана вновь связанным кодом, поэтому основные механизмы для нового поведения должны быть уже разработаны для предварительно скомпилированного приложения: ожидания для вновь доступных переменных , функции и фабричные методы / виртуальная диспетчеризация.

Если вам действительно нужно что-то более ограниченное, например, способность оценивать математические выражения или логические предикаты , возможно, выраженные в стиле исходного кода C ++, возможно, чтение или установка некоторых из ваших значений, тогда различные более ограниченные и специализированные библиотеки и встроенные интерпретации доступны. Есть даже библиотеки для создания таких парсеров, такие как библиотека Boost Spirit.

Наконец, в приложение C ++ могут быть встроены переводчики для других языков - Lua, Ruby, Python, Perl, TCL и т. Д., Которые поддерживают различные подходы к взаимодействию и безопасности.

4 голосов
/ 19 мая 2011

Вы можете использовать system(): http://linux.die.net/man/3/system

...