读nodej源码,补c++知识
知识点1 explice、inline
explicit V8_INLINE Local(T* that) : val_(that) {}
- explicit
首先是explicit关键字,是用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。
什么是隐式转换?
class Number {
public:
int value;
Number(int num) {
value = num;
}
}
//隐式转换
Number num=1;
//相当于如下↓
Number num(1);
- V8_INLINE(强制内联)
## define V8_INLINE inline __attribute__((always_inline))
编译相关,不影响代码逻辑,将函数强制内联
- Local(T* that):val_(that){}
相当于用that初始化数据val_
其中Local是构造函数,函数内不做任何事。
使用初始化列表来初始化字段:
Line::Line( double len): length(len)
{
cout << "Object is being created, length = " << len << endl;
}
上面的语法等同于如下语法:
Line::Line( double len)
{
length = len;
cout << "Object is being created, length = " << len << endl;
}
假设有一个类 C,具有多个字段 X、Y、Z 等需要进行初始化,同理地,您可以使用上面的语法,只需要在不同的字段使用逗号进行分隔,如下所示:
C::C( double a, double b, double c): X(a), Y(b), Z(c)
{
....
}
知识点2 reinterpret_cast
reinterpret_cast
- reinterpret_cast
reinterpret_cast 用于进行各种不同类型的指针之间、不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换。转换时,执行的是逐个比特复制的操作。
知识点3 \ 带参数宏定义 extern extern “C”
#define NODE_MODULE_CONTEXT_AWARE_X(modname, regfunc, priv, flags) \
extern "C" { \
static node::node_module _module = \
{ \
NODE_MODULE_VERSION, \
flags, \
NULL, \
__FILE__, \
NULL, \
(node::addon_context_register_func) (regfunc), \
NODE_STRINGIFY(modname), \
priv, \
NULL \
}; \
NODE_C_CTOR(_register_ ## modname) { \
node_module_register(&_module); \
} \
}
- \
用于定义多行宏定义 - 带参数的宏定义NODE_MODULE_CONTEXT_AWARE_X(modname, regfunc, priv, flags)
在源码中调用NODE_MODULE_CONTEXT_AWARE_X(...)相当于直接调用下面的extern "C"{}
宏定义其实就是一段复制黏贴。 - extern
即只声明不定义
//headr.h
extern int x;
如果没有extern,header.h又被多处引用,那么就会产生重复定义错误。
声明可以多次,定义只能一次
- extern "C"
C表示的一种编译和连接规约,而非一种语言。
知识点4 重载
void SetupProcessObject(Environment* env,
int argc,
const char* const* argv,
int exec_argc,
const char* const* exec_argv) {
.......
}
void SetupProcessObject(const FunctionCallbackInfo<Value>& args) {
....
}
允许同名函数定义,调用时会根据变量选择不同的同名函数。

浙公网安备 33010602011771号