main()用作函数和CLI

时间:2015-03-02 14:44:34

标签: c++ build g++ gnu-make entry-point

我有几个源文件作为匿名发布/订阅节点一起运行。有一个main函数可以收集所有节点并通过它们的启动函数启动它们。

// 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);
}

为了使配置更容易,我想将main函数转换为启动这些节点的shell脚本。这意味着将start_node()函数转换为main()函数,以便它们从命令行运行。

#!bin/bash
node_a -args
node_b -different_args

这使得运行测试变得更加棘手,b / c节点main()函数会与测试main()冲突,并且不再有tart_node()函数,自动化测试可以运行

我的解决方案是将start_node函数包装在main函数中,但是这需要为每个节点添加一些额外的样板,并且在测试链接期间忽略main而不是节点构建(我实际上是不确定我是否可以使用gnumake& g ++)。

// nodeA.cpp  
int main(int argc, char *argv[])
{
  start_node_a(argc, argv);
}

有更优雅的方法吗?一种从测试中的函数调用启动程序,以及从命令行启动程序的方法?

*注意:我也考虑过系统调用,但会考虑使用比使用main()包装器更糟糕的解决方案。

1 个答案:

答案 0 :(得分:0)

您是否考虑在程序中嵌入解释器(如LuaGuile?然后你会写一些脚本(在Lua,Guile等......)来驱动各种start_node_a等...

基本上,你将添加一些特定于应用程序的原语绑定并粘贴到Lua或Guile解释器上,并且你将编写一些Lua或Guile脚本。两者都有详细记录(这里是Lua doc,这里是Guile doc)并且非常有用。

对于Lua:使用lua_newstate创建状态,然后使用lua_register添加基元luaL_dofile来运行文件,luaL_dostring来评估字符串。

对于Guile:阅读Programming Overview

顺便说一句,我会推荐Guile(LGPL许可)而不是Lua(麻省理工学院许可),因为我更喜欢Scheme(Guile语言)而不是Lua语言。在所有情况下,请谨慎对待内存管理。