main() 用作函数和 CLI
main() used as a function and CLI
我有几个源文件 运行 一起作为匿名 publish/subscribe 节点。有一个主要功能收集所有节点并通过它们的启动功能启动它们。
// main.cpp
#include "nodeA.h"
#include "nodeB.h"
int main(int argc, char *argv[])
{
/* some argument parsing here */
start_node_a(argc, argv);
start_node_b(argc, argv);
}
为了使其更易于配置,我想将主要功能转变为启动这些节点的 shell 脚本。这意味着将 start_node()
函数转换为 main()
函数,以便它们从命令行 运行。
#!bin/bash
node_a -args
node_b -different_args
这使得 运行 测试变得更加棘手,b/c 节点 main()
函数将与测试 main()
发生冲突,并且不再有 start_node()
自动化测试可以 运行.
的功能
我的解决方案是将 start_node
函数包装在一个 main 函数中,但这需要为每个节点提供一些额外的样板,以及一些额外的构建向导以在测试链接期间忽略 main 而不是节点构建(我'我实际上不确定我是否可以让它与 gnumake 和 g++ 一起工作)。
// nodeA.cpp
int main(int argc, char *argv[])
{
start_node_a(argc, argv);
}
有没有更优雅的方法来做到这一点?从测试中的函数调用启动程序和从命令行启动程序的方法?
*注意:我也考虑过系统调用,但认为这是比使用 main() 包装器更糟糕的解决方案。
您是否考虑过在您的程序中嵌入解释器(如 Lua or Guile)?然后您将编写一些脚本(在 Lua、Guile 等....)来驱动您的各种 start_node_a
等...
所以基本上,您将添加一些绑定并粘附到 Lua 或 Guile 解释器的特定于应用程序的原语,然后您将编写一些 Lua 或 Guile 脚本。两者都有据可查(这里是Lua doc, here is Guile doc)并且非常常用。
对于Lua:使用lua_newstate
创建一个状态,然后使用lua_register
添加一个图元,luaL_dofile
到运行一个文件,luaL_dostring
计算一个字符串。
对于 Guile:阅读 Programming Overview
顺便说一句,相比 Lua(MIT 许可),我更推荐 Guile(LGPL 许可),因为比起 Lua 语言,我更喜欢 Scheme(Guile 语言)。在任何情况下,都要谨慎管理内存。
我有几个源文件 运行 一起作为匿名 publish/subscribe 节点。有一个主要功能收集所有节点并通过它们的启动功能启动它们。
// main.cpp
#include "nodeA.h"
#include "nodeB.h"
int main(int argc, char *argv[])
{
/* some argument parsing here */
start_node_a(argc, argv);
start_node_b(argc, argv);
}
为了使其更易于配置,我想将主要功能转变为启动这些节点的 shell 脚本。这意味着将 start_node()
函数转换为 main()
函数,以便它们从命令行 运行。
#!bin/bash
node_a -args
node_b -different_args
这使得 运行 测试变得更加棘手,b/c 节点 main()
函数将与测试 main()
发生冲突,并且不再有 start_node()
自动化测试可以 运行.
我的解决方案是将 start_node
函数包装在一个 main 函数中,但这需要为每个节点提供一些额外的样板,以及一些额外的构建向导以在测试链接期间忽略 main 而不是节点构建(我'我实际上不确定我是否可以让它与 gnumake 和 g++ 一起工作)。
// nodeA.cpp
int main(int argc, char *argv[])
{
start_node_a(argc, argv);
}
有没有更优雅的方法来做到这一点?从测试中的函数调用启动程序和从命令行启动程序的方法?
*注意:我也考虑过系统调用,但认为这是比使用 main() 包装器更糟糕的解决方案。
您是否考虑过在您的程序中嵌入解释器(如 Lua or Guile)?然后您将编写一些脚本(在 Lua、Guile 等....)来驱动您的各种 start_node_a
等...
所以基本上,您将添加一些绑定并粘附到 Lua 或 Guile 解释器的特定于应用程序的原语,然后您将编写一些 Lua 或 Guile 脚本。两者都有据可查(这里是Lua doc, here is Guile doc)并且非常常用。
对于Lua:使用lua_newstate
创建一个状态,然后使用lua_register
添加一个图元,luaL_dofile
到运行一个文件,luaL_dostring
计算一个字符串。
对于 Guile:阅读 Programming Overview
顺便说一句,相比 Lua(MIT 许可),我更推荐 Guile(LGPL 许可),因为比起 Lua 语言,我更喜欢 Scheme(Guile 语言)。在任何情况下,都要谨慎管理内存。