C ++仿真来自节点的int main(int argc,char * argv )

基本上我正在使用他们的NAPIfunction来将现有的C ++文件与我们的javascript / node进行整合。 我有一个testingC ++文件工作,所以我知道我的设置工作。 但是,在实际的C ++文件中,它被devise为从命令行使用argc和argv从命令行运行。 基本上我只需要从其他函数内部调用C ++的主要方法,这意味着没有命令行。 所以我必须传递argc和argv的值。 argc只是一个int,这很容易,但argc是char **types,从我的研究看来,它是一个字符数组又名string的数组?

这是我的C ++文件底部的当前代码

void Init(Env env, Object exports, Object module) { exports.Set("main", Function::New(env, main(2,{"test","test2"}))); } NODE_API_MODULE(addon, Init) 

argc值工作正常

我想创build一个临时/testing值为argv传入,但我有一个问题搞清楚如何使我的价值观typeschar **数组。

argv是指向string的指针数组(实际上是NUL终止的字符数组),其中元素0是程序的名称,元素1 … argc-1是程序参数,元素argc必须是NULL 1

在C ++中没有数组字符,所以你必须显式地创build一个数组variables来传递给函数。 更糟的是, main允许修改传递的参数,所以你甚至不能构build一个string数组的数组,因为它们是只读的。 因此,您必须为每个参数显式分配读/写空间。 准系统解决scheme可以为每个参数设置单个缓冲区,并从中构build指针数组:

 char argv0[] = "test_program"; char argv1[] = "arg1"; char argv2[] = "arg2"; char *argv[] = {argv0, argv1, argv2, NULL}; main(3, argv); 

更灵活的一个(特别是如果你必须dynamic构build你的参数)可以使用std::vector<std::string>

 std::vector<std::string> args = { "test_program", "arg1", "arg2" }; // ... here you may add other arguments dynamically... args.push_back("arg3"); // whatever // build the pointers array std::vector<char *> argv; for(std::string &s: args) argv.push_back(&s[0]); argv.push_back(NULL); main(argv.size()-1, argv.data()); 

现在,来到您的代码:

 void Init(Env env, Object exports, Object module) { exports.Set("main", Function::New(env, main(2,{"test","test2"}))); } NODE_API_MODULE(addon, Init) 

除了不能像这样构buildargv传递给main事实,你试图调用 main并将其结果作为Function::New第二个parameter passing,而Function::New 一些可调用的types (例如函数指针)注册为名为main的导出处理程序! 从Function::New复制Function::New文档:

 /// Callable must implement operator() accepting a const CallbackInfo& /// and return either void or Value. 

所以,作为一个简单的例子,你可以通过注册一个callback来导出你的main作为一个无参数的JS函数,它不会返回任何东西(我猜呢?

 void MainCallback(const CallbackInfo& info) { char argv0[] = "test_program"; char argv1[] = "arg1"; char argv2[] = "arg2"; char *argv[] = {argv0, argv1, argv2, NULL}; main(3, argv); } void Init(Env env, Object exports, Object module) { exports.Set("main", Function::New(env, MainCallback)); } NODE_API_MODULE(addon, Init) 

最后,正如其他人所说,技术上在C + + main是有点神奇 – 它是从程序内部调用它的未定义的行为; 在实践中,在我知道的任何平台上,也可以运行node.js, main是一个非常规则的函数,恰好在启动时由C运行时调用,所以我不认为这会引起任何问题。


笔记

  1. 所以,你可以说这是一个以NUL结尾的字符数组的NULL结尾数组。 注意这里NULL =空指针; NUL =string结束符,即'\0'