是否可以在C(而不是C++)中编写node.js扩展名?

noa*_*hlz 18 c node.js

一个快速的谷歌搜索产生至少一个为node.js 编写C++"Hello World"的教程,但目前还不清楚是否可以仅使用C编写这样的扩展.假设它有可能,我将面临哪些挑战/限制?

log*_*yth 15

如果需要,您可以在C中编写扩展的一部分,但是至少需要一小部分C++代码才能将C代码与Node粘合在一起.

正如您将在HelloWorld中看到的那样,扩展依赖于v8.hnode.h头,它们具有Node期望的所有类.如果没有这些,您将无法正确创建JS对象以导出回Node.

也就是说,你可以很容易地编写一小组C++函数,它们只调用C函数,并包装某种C结构.


noa*_*hlz 8

在Hacker News上找到了这个:

https://github.com/wesolows/v8plus

v8 +:节点将C++添加到C边界

这个层提供了一种在C语言中编写至少简单的Node插件的方法,而不会有你想要使用的所有可怕的C++ goop.那个goop仍然存在,但你不必写它.更重要的是,您可以在一个理智的编程环境中编写模块,避免混淆和容易出错的C++语义.


Ber*_*mos 6

现在我们至少有3个不错的选择:

node-ffi: Node.js外部函数接口
插件,用于使用纯JavaScript加载和调用动态库.它可用于创建与本机库的绑定,而无需编写任何C代码
https://github.com/node-ffi/node-ffi

SWIG: Simplified Wrapper和Interface Generator
(它为许多语言生成包装器,可以立即解决许多问题)
http://www.swig.org/

emscripten将
C和C++编译成高度可优化的JavaScript,即使在网络上也能以接近本机的速度运行,无需插件.
http://kripken.github.io/emscripten-site/


Azi*_*zSM 5

需要使用extern"C"语法在C++代码中声明单个C函数

例:

#define BUILDING_NODE_EXTENSION
#include <node.h>

extern "C" void f(int i, char c, float x);

using namespace v8;
Run Code Online (Sandbox Code Playgroud)

如果您有多个C函数,则可以通过大括号进行分组:

extern "C" {
  void   f(int i, char c, float x);
  int    g(char* s, char const* s2);
  double sqrtOfSumOfSquares(double a, double b);
}
Run Code Online (Sandbox Code Playgroud)

然后从C++函数调用该函数:

Handle<Value> MyFunction(const Arguments& args) {
  HandleScope scope;
   f(7, 'x', 3.14);    // <--- 
  return scope.Close(String::New("Hello"));
}

Handle<Value> CreateFunction(const Arguments& args) {
  HandleScope scope;

  Local<FunctionTemplate> tpl = FunctionTemplate::New(MyFunction);
  Local<Function> fn = tpl->GetFunction();
  fn->SetName(String::NewSymbol("theFunction")); // omit this to make it anonymous

  return scope.Close(fn);
}

void Init(Handle<Object> target) {
  target->Set(String::NewSymbol("createFunction"),
      FunctionTemplate::New(CreateFunction)->GetFunction());
}


NODE_MODULE(addon, Init)
Run Code Online (Sandbox Code Playgroud)

注意:使用Nodejs Addons中的示例代码