理解 C 结构
Understanding C struct
我正在尝试了解以下 C 结构中发生的事情:
/* EXCERPT from LINES 59-90 */
/* parse.h
* Copyright (c) 2011, Peter Ohler
* All rights reserved.
*/
typedef struct _ParseInfo {
// used for the string parser
const char *json;
const char *cur;
const char *end;
// used for the stream parser
struct _Reader rd;
struct _Err err;
struct _Options options;
VALUE handler;
struct _ValStack stack;
CircArray circ_array;
int expect_value;
VALUE proc;
VALUE (*start_hash)(struct _ParseInfo *pi);
void (*end_hash)(struct _ParseInfo *pi);
VALUE (*hash_key)(struct _ParseInfo *pi, const char *key, size_t klen);
void (*hash_set_cstr)(struct _ParseInfo *pi, Val kval, const char *str, size_t len, const char *orig);
void (*hash_set_num)(struct _ParseInfo *pi, Val kval, NumInfo ni);
void (*hash_set_value)(struct _ParseInfo *pi, Val kval, VALUE value);
VALUE (*start_array)(struct _ParseInfo *pi);
void (*end_array)(struct _ParseInfo *pi);
void (*array_append_cstr)(struct _ParseInfo *pi, const char *str, size_t len, const char *orig);
void (*array_append_num)(struct _ParseInfo *pi, NumInfo ni);
void (*array_append_value)(struct _ParseInfo *pi, VALUE value);
void (*add_cstr)(struct _ParseInfo *pi, const char *str, size_t len, const char *orig);
void (*add_num)(struct _ParseInfo *pi, NumInfo ni);
void (*add_value)(struct _ParseInfo *pi, VALUE val);
} *ParseInfo;
来自 https://github.com/ohler55/oj/blob/master/ext/oj/parse.h#L59:
我不明白第 74 行(上面清单中的第 22 行)是怎么回事。
开始于:
VALUE (*start_hash)(struct _ParseInfo *pi);
有人可以解释一下这些行的作用吗?
它们是function pointers,语法是:return-type (*pointer_name)(args)
。
但是,开发人员使用了一种特殊技术,由第一个参数表示,它始终是指向 _Parser
结构的指针。它确实允许一种简单的面向对象编程形式,其中 类 可以具有专门作用于必须手动设置和处理的特定对象实例的方法。 @paxdiablo 的出色回答 here.
中提供了更多信息
注意:存在多项 ISO C 违规行为,因为您不允许在名称前加上 _
和大写名称。更多信息 here.
我正在尝试了解以下 C 结构中发生的事情:
/* EXCERPT from LINES 59-90 */
/* parse.h
* Copyright (c) 2011, Peter Ohler
* All rights reserved.
*/
typedef struct _ParseInfo {
// used for the string parser
const char *json;
const char *cur;
const char *end;
// used for the stream parser
struct _Reader rd;
struct _Err err;
struct _Options options;
VALUE handler;
struct _ValStack stack;
CircArray circ_array;
int expect_value;
VALUE proc;
VALUE (*start_hash)(struct _ParseInfo *pi);
void (*end_hash)(struct _ParseInfo *pi);
VALUE (*hash_key)(struct _ParseInfo *pi, const char *key, size_t klen);
void (*hash_set_cstr)(struct _ParseInfo *pi, Val kval, const char *str, size_t len, const char *orig);
void (*hash_set_num)(struct _ParseInfo *pi, Val kval, NumInfo ni);
void (*hash_set_value)(struct _ParseInfo *pi, Val kval, VALUE value);
VALUE (*start_array)(struct _ParseInfo *pi);
void (*end_array)(struct _ParseInfo *pi);
void (*array_append_cstr)(struct _ParseInfo *pi, const char *str, size_t len, const char *orig);
void (*array_append_num)(struct _ParseInfo *pi, NumInfo ni);
void (*array_append_value)(struct _ParseInfo *pi, VALUE value);
void (*add_cstr)(struct _ParseInfo *pi, const char *str, size_t len, const char *orig);
void (*add_num)(struct _ParseInfo *pi, NumInfo ni);
void (*add_value)(struct _ParseInfo *pi, VALUE val);
} *ParseInfo;
来自 https://github.com/ohler55/oj/blob/master/ext/oj/parse.h#L59:
我不明白第 74 行(上面清单中的第 22 行)是怎么回事。
开始于:
VALUE (*start_hash)(struct _ParseInfo *pi);
有人可以解释一下这些行的作用吗?
它们是function pointers,语法是:return-type (*pointer_name)(args)
。
但是,开发人员使用了一种特殊技术,由第一个参数表示,它始终是指向 _Parser
结构的指针。它确实允许一种简单的面向对象编程形式,其中 类 可以具有专门作用于必须手动设置和处理的特定对象实例的方法。 @paxdiablo 的出色回答 here.
注意:存在多项 ISO C 违规行为,因为您不允许在名称前加上 _
和大写名称。更多信息 here.