Dynamic source code in C++ [closed]

懵懂的女人 提交于 2019-11-27 14:33:01
slacy

C++ is a compiled language, and thus, there is no equivalent to "eval()".

For the specific example you mention, you could make a function registry that maps inputs (strings) to outputs (function pointers) and then call the resultant function.

There are several C++ interpreter libraries that are available, although performance will be very poor, they may accomplish what you want. Google search for "C++ interpreter". I've seen results for "Ch", "CINT" and "clipp"

alamar

The real answer to your question is this:

extern "C" {
void function1 ();
void function2 ();
void function3 ();
}


 int main (int argv, char * argv [])
 {
     char * myString = new char [100];
     ...
     myString = "function1"; //user input     

     void (*f)() = dlsym(RTLD_NEXT, myString);
     f();
 }

You can obtain the function defined in your binary (by its name, if it was declared with extern "C"), and call it.

On windows, it becomes uglier, but still possible - read on GetProcAddress

You could embed a C/C++ interpreter into your program if you really need this. However, you could also embed a more script-like language instead.

To answer your question of how this is usually done, the answer is: it isn't.

Having to use something like eval() is usually a design problem. If you really do need it, embed a scripting language such as Lua or Python.

If you put function1 .. functionN in a DLL, you could simply pull them out and invoke them by name using dlopen/dlsym which would probably get you 90% of the way you want to go.

How about function pointers?

The C++ language itself is not able to do that directly. But you may use plateform specific functions to call any function in a given DLL, according to user input (or whatever). For example, on Windows, look for GetProcAddress() and LoadLibrary()

This is a good case for embedding an interpreted language like LUA. If you create LUA bindings to your C++ API, you'll be able to dynamically execute your code via LUA code from your application.

sapru.vivek

There are two ways of doing this :

  1. Dynamic Loading

    • Windows: GetModuleFileName() with hModule = NULL this gives the path of the executable. Use LoadLibrary(Executable_Name) to load itself in the memory.
    • Linux : Use dloopen() with NULL and it loads itself in memory.

    In both Windows and Linux you can define a void* (function*)() pointer. This always works with all signatures without parameters. This does not work on class methods.

  2. Using Namespace System

    This namespace would be easy you can use the Inspect functionality and InvokeMember methods to dynamically call class methods and access variable from inside the class.

You can't do that in C++. It is a mandatorily-compiled language.

A lot of information that would be necessary to implement eval() is lost at run-time anyway.

I would build an array, or an STL list, of function pointers and the strings that you find that trigger the call to them. If you really need to call an arbitrary function you should investigate RTTI http://en.wikipedia.org/wiki/Run-time_type_information

how do I declare an array of pointers to functions?

The C programmer's response to this question:

use cdecl.

cdecl> declare functable as pointer to function (int,pointer to int) returning double

double (*functable)(int , int *)

cdecl> declare functable as array 17 of pointer to function (int) returning double

double (*functable[17])(int )

Note that functions automatically convert into pointers to functions, in the same sense that arrays decay into pointers. You don't need an & to take the address of a function to put it in a pointer.

If you're in C++, it might help to use a std::map<YourFunctionPointerType> instead of an array, since you want to map strings anyway...

The OO approach:

Use polymorphism instead. It doesn't immediately solve your problems, but there's a good chance that if you're doing this it makes sense to have a class for each function.

Note that a vtable is, fundamentally, a table of pointers to functions.

What you want is reflection. It's not supported by default in C++, but many people have written comprehensive reflection systems for all sorts of purposes. One that comes to mind off the top of my head is binding C++ functions to a custom scripting language.

Others have mentioned using a switch statement (or more accurately and if/else tree). This is about as simple as a reflection system is likely to come... and it is probably the best solution for your project. Reflection in C++ is a fairly advanced technique and often requires a lot of additional code... sometimes even custom preprocessors.

Also note that for security purposes, eval() is almost never something you want to be using in any language.

The best way to embed and eval code within a C++ application is probably to use a scripting language like python. Use Boost.Python, "a C++ library which enables seamless interoperability between C++ and the Python programming language."

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!