在ruby.h,有很多功能宏定义如下:
static inline int
#if defined(HAVE_PROTOTYPES)
rb_type(VALUE obj)
#else
rb_type(obj)
VALUE obj;
#endif
{
if (FIXNUM_P(obj)) return T_FIXNUM;
if (obj == Qnil) return T_NIL;
if (obj == Qfalse) return T_FALSE;
if (obj == Qtrue) return T_TRUE;
if (obj == Qundef) return T_UNDEF;
if (SYMBOL_P(obj)) return T_SYMBOL;
return BUILTIN_TYPE(obj);
}
Run Code Online (Sandbox Code Playgroud)
如果HAVE_PROTOTYPES==1,根据我的理解,这个功能将是这样的:
static inline int rb_type(VALUE obj)
{
...
}
Run Code Online (Sandbox Code Playgroud)
然而,如果HAVE_PROPOTYPES==0,函数定义将是这样的:
static inline int rb_type(VALUE obj)
VALUE obj;
{
...
}
Run Code Online (Sandbox Code Playgroud)
我不明白这是否在语法上是正确的.我该怎么理解呢?
static inline int rb_type(VALUE obj)
VALUE obj; # what the hack is this?
{
...
}
Run Code Online (Sandbox Code Playgroud)
这是K&R C.没有人再使用它了.它至少已被弃用了20年.
很久以前,函数定义写得像这样:
int myfunc(myparam)
int myparam;
{
...
}
Run Code Online (Sandbox Code Playgroud)
代替
int myfunc(int myparam)
{
...
}
Run Code Online (Sandbox Code Playgroud)
所以HAVE_PROTOTYPES总会在任何体面的编译器上定义.