«Вычислить функцию» на C

#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() . Вы правы, что это не эквивалентно Matlab eval

4. @Als: Это в stdlib.h : cplusplus.com/reference/clibrary/cstdlib/system

5. 1: Хотя это может быть не то, чего хочет OP, это, безусловно, то, о чем он просил…