c ++编写一个控制台应用程序,您可以从中调用自己定义的函数[关闭]

Posted

技术标签:

【中文标题】c ++编写一个控制台应用程序,您可以从中调用自己定义的函数[关闭]【英文标题】:c++ Writing a cosole application from which you can call functions defined in it self [closed] 【发布时间】:2017-10-01 13:39:14 【问题描述】:

您好,我是 C++ 新手,我想编写一个程序,它允许我在编译和运行时测试其中定义的不同功能。

我可以做一个简单的switch 接收来自cin 的案例,但是我必须为我编写的每个函数维护它,而且我不确定如何通过它传递参数(比如我说我是新人)

我来自 haskell,您可以使用自定义参数调用您喜欢的任何功能...(使测试边缘案例和单个“零件”变得非常容易)

我将如何在 C++ 中做到这一点?

谢谢

【问题讨论】:

一本适合初学者的好书就是答案。 我只是想要一种方法来测试我的函数,用不同的情况,而不是每次都编译 C++是编译型语言,不编译就无法执行。至于测试,有专门的单元测试套件允许您按需只运行所需的部分,例如 Microsoft Unit Testing Framework for C++ 或 Boost.Test。 所以没有办法编写可以在运行时通过名称调用函数的方法吗? 你绝对可以实现这样的程序行为,瞧,你又得到了另一种动态语言。 【参考方案1】:

一种可能的方法是在您的 C++ 应用程序中嵌入一些解​​释器(如 Lua、Guile 等...)。然后,您的高级用户将使用该语言编写一些脚本,并可以调用您嵌入(即接口或粘合)该解释器的任何例程。

(或者,编写您自己的解释器,但这是更多工作)

另一种方法可能是使用dynamic loading 设施,但这些是特定于操作系统的。在 Linux(和 POSIX)上,您将使用 dlopen(3) 和 dlsym(3)。请注意name mangling,因此对于要在运行时使用dlsym 加载的那些C++ 函数,请使用extern "C"(请参阅C++ dlopen mini howto)。

一种变体可能是(使用您的 C++ 代码)在临时文件中动态生成一些 C++ 源代码(可能来自一些用户输入;您需要一些中间 AST),fork 将该代码编译成临时文件plugin,并使用dlopen 动态加载它,然后运行它(使用通过dlsym 获得的原始函数指针)

但是(与 Haskell、Scheme 或 Ocaml 相比)C++ 中没有 REPL,所以如果你想要一些,你需要制作一个(使用我上面考虑的技巧),这对于一个C++新手。 C++ 实际上是一种应该编译的编程语言(实际上是使用 compiler 如 GCC 或 Clang 由一些 build automation 工具启动,如 GNU make 或 ninja)。而且C++ 是一门非常复杂的语言,学习和编译都很困难,所以它的所有编译器都比较慢。

顺便说一句,请务必至少学习 C++11。

也许你想要一些unit testing。有一些工具和库可以帮助解决这个问题(请参阅 this answer 和 that list)

我可以做一个简单的开关,从 cin 接收案例

你应该考虑更多花哨的东西。例如,您至少可以有一些 std::map 和 std::string-s 键和一些 common std::function 类型的值,然后使用 lambda expressions 填充它。

您可以阅读最新的Dragon Book;从中学习解析、解释和编译技术很有帮助(它们比你想象的更符合你的愿望)。

另请阅读SICP(可免费下载编程介绍,使用Scheme);它与 C++ 无关,但会帮助您将 Haskell 与 C++ 联系起来,并提高您对编程的思考。

【讨论】:

不,我想学习 c++ 而不是 lua 或其他东西,这个问题只是毁了我的小代表,太棒了,但仍然 你还需要学习编程(而不仅仅是C++语法);请参阅 norvig.com/21-days.html 以获得有用的见解。 感谢您非常复杂而冗长的回答无论如何,我只是做了一个错误的假设,即我可以像 haskell 一样接近它,这是愚蠢的 但是你最初的愿望并不是不明智的,它在 C++ 中比你想象的要复杂得多。【参考方案2】:

我自己的正确答案是:

我不能这样做,因为函数的名称甚至不再存在。仅用所有必要信息编译它们的逻辑后。

--> 所以你不能在编译后的代码中通过函数名来调用函数,除非你想编写自己的用户界面/关键字解释器

谢谢

【讨论】:

C++ 函数名称在运行时消失的事实不应禁止您在程序中明确 存储一些名称(请参阅我的回答中提到的std::map)。当然,你的名字先验与 C++ 编译器处理的名字无关。

以上是关于c ++编写一个控制台应用程序,您可以从中调用自己定义的函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

棘手的 C 问题。动态函数调用

C语言中如何在源程序中调用另一个源程序中的模块(函数)(自己编写的)?

一个c语言工程中可以有几个头文件,两个文件间函数调用其中之一要是头文件吗?

linux内核系统调用和标准C库函数的关系分析

我可以使用 phonegap 来调用我的自定义 Objective C 类的方法吗?

C语言中。如果编写了一个函数,想在不同源文件中调用。