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 语言)。在任何情况下,都要谨慎管理内存。