#c #visual-studio-2008 #string #function #evaluation
#c #visual-studio-2008 #строка #функция #оценка
Вопрос:
Я хочу знать, существует ли функция «оценки» в C , подобная функции Matlab.
На практике мне нужна функция, которая может интерпретировать строку как командную строку.
спасибо за ответы.
Комментарии:
1. Привет, Cavs85! Добро пожаловать в Stack Overflow. Было бы полезно, если бы вы могли включить ссылку на документацию для
evaluate
функции Matlab. Поскольку я не знаю, что она делает, я не могу сказать вам, какая функция C похожа на нее.2.
eval(expression)
«выполняет выражение , строку, содержащую любое допустимое выражение MATLAB». Вам нужна функция C , которая может выполнять произвольное выражение MATLAB? Или вам нужна функция C , которая может выполнять произвольное выражение C ? Или что-то еще?3. Это звучит как «проблема XY» mywiki. wooledge.org/XyProblem . @Cavs85, пожалуйста, опишите вашу конечную цель, а не только то, на чем вы застряли.
Ответ №1:
Если вы на самом деле пытаетесь «оценить» исходный код C в запущенном приложении C , то в принципе нет — это не функция, указанная языком.
Существуют интерпретаторы для подмножеств C (например, CInt, Ch и UnderC ) — они могут быть в состоянии запустить вашу программу на C , если она относительно простая. В качестве альтернативы, некоторые из них могут быть встроены в скомпилированную программу на C , чтобы обеспечить некоторую оценку исходного кода во время выполнения, но с ограниченным доступом и возможностью изменять предварительно скомпилированный код и его переменные.
Для запущенной программы также возможно вызвать компилятор и динамически загрузить / связать результирующую библиотеку, но это очень необычная практика и не без проблем с производительностью, безопасностью и взаимодействием:
- создание нового процесса для компилятора, компиляция и компоновка — это относительно ресурсоемкая и медленная операция, но после того, как библиотека связана, новый код может выполняться с обычной скоростью вне очереди вызова функции
- обычные проблемы с выполнением внешнего процесса
- обеспечение того, чтобы путь и имя исполняемого файла компилятора не могли быть изменены вредоносными вводимыми данными в программу
- чтобы никакая вредоносная программа не заменяла компилятор и не заражала его
- исходный код «на лету» не содержит таких инструкций, как
system()
,exec()
,unlink()
вызовы, злоупотребление сетевым подключением, использование необоснованных ресурсов процессора / памяти / дескрипторов и т.д.
- предварительно скомпилированная программа на C не может быть изменена или легко / глубоко исследована с помощью нового связанного кода, поэтому основные механизмы для нового поведения, должно быть, уже разработаны в предварительно скомпилированном приложении: ожидания для новых доступных переменных, функций и заводских методов / виртуальной отправки.
Если вам действительно нужно что-то более ограниченное, например, возможность оценивать математические выражения или логические предикаты, возможно, выраженные в стиле C -source, возможно, чтение или установка некоторых ваших значений, тогда доступны различные более ограниченные и специализированные библиотеки и встроенные интерпретируемые. Существуют даже библиотеки для создания таких анализаторов, такие как библиотека boost spirit.
Наконец, интерпретаторы для других языков — Lua, Ruby, Python, Perl, TCL и т.д. — Могут быть встроены в приложение C , используя различные подходы к совместимости и безопасности.
Ответ №2:
Вы можете использовать system()
: http://linux.die.net/man/3/system
Комментарии:
1. Это позволит вам вызвать какую-либо другую программу, которая предоставляет функцию в
eval
стиле, давайте не будем путать ее со стандартным средством вычисления выражений C .2.
system()
Доступна ли она также в Windows? В вопросе упоминаетсяvisual studio
.3. @Ben, поскольку OP запросил «функцию, которая может интерпретировать строку как командную строку», я использовал
system()
. Вы правы, что это не эквивалентно Matlabeval
4. @Als: Это в
stdlib.h
: cplusplus.com/reference/clibrary/cstdlib/system5. 1: Хотя это может быть не то, чего хочет OP, это, безусловно, то, о чем он просил…