我正在try 在C中构建二进制格式和JSON之间的双向转换(以使映射可脚本化).我查看了13个C JSON解析器,发现只有2个具有我想要的所有功能.一种是LGPL,另一种使用回调.必须将我的代码放到一个单独的DLL中,这样我就不会将LGPL与专有代码混合在一起,这是一项复杂的工作,所以我会首先try 使用"回调API".
基于回调的API如下所示(经过大量编辑的代码):
typedef void *(*api_malloc_func)(void *ctx, size_t sz);
/* ... */
typedef struct {
api_malloc_func malloc;
/* ... */
} api_config_params;
typedef struct {
int (* api_on_bool)(void * ctx, int boolVal);
int (* api_on_int)(void * ctx, long long intVal);
/* ...*/
/* "user-defined data", passed to callbacks. */
void * ctx;
} api_callbacks;
api_handle api_config(const api_callbacks * callbacks, const api_config_params * cfg);
api_status api_parse(api_handle hand, const unsigned char * json, size_t len);
但是我想要/需要的是,让这个API"看起来像"二进制API,是这样的:
typedef struct {
api_malloc_func malloc;
/* ... */
/* "user-defined data" */
void * ctx;
} api_config_params;
api_handle api_config(const api_config_params * cfg);
typedef enum api_type_t {
api_type_bool,
api_type_int,
/* ... */
} api_type_t;
api_type_t api_peek_type(api_config_params* reader);
bool api_read_bool(api_config_params* reader, bool* boolVal);
bool api_read_int(api_config_params* reader, long long* intVal);
/* ... */
自从我最后一次用C/C++编写代码(我现在是一名"Java程序员")以来已经forever年了,所以我不知道如何包装基于回调/事件的API,使其成为"非回调/基于事件的",也就是"同步".
那么,我该怎么做呢?理想情况下,不会使代码不是线程安全的.这有可能吗?
注意:我想我可以让二进制API改为使用回调,但这会使它变慢,而且我只关心二进制API的速度,而不关心JSON API的速度.