Я хочу портировать вызовы C из примера C в пример C ++. Но я не уверен, что это правильный способ сделать это. В части memset, что я должен заменить для кода C ++?
static int begin_request_handler(struct mg_connection *conn) {
return 1;
}struct mg_callbacks {
int (*begin_request)(struct mg_connection *);
void (*end_request)(const struct mg_connection *, int reply_status_code);
int (*log_message)(const struct mg_connection *, const char *message);
int (*init_ssl)(void *ssl_context);
int (*websocket_connect)(const struct mg_connection *);
void (*websocket_ready)(struct mg_connection *);
int (*websocket_data)(struct mg_connection *);
const char * (*open_file)(const struct mg_connection *,
const char *path, size_t *data_len);
void (*init_lua)(struct mg_connection *, void *lua_context);
void (*upload)(struct mg_connection *, const char *file_name);
};struct mg_callbacks callbacks;
memset(&callbacks, 0, sizeof(callbacks));
callbacks.begin_request = begin_request_handler;
Как должен выглядеть memset, если я вызываю его из C ++?
Хорошо, так, как я хотел бы это так:
struct mg_callbacks callbacks = { };
Это заполнит его нулевыми значениями.
Но memset
это прекрасно — C ++ разработан так, чтобы принимать код на C с небольшими изменениями или без них, поэтому, если вам НЕ НУЖНО что-либо менять, я не вижу реальной причины для изменения кода.
Конечно, вы также можете объявить конструктор в mg_callbacks
который устанавливает каждый из указателей на NULL
например,
struct mg_callbacks
{
mg_callbacks()
{
begin_request = NULL;
...
}
...
};
Это гарантирует, что ни один код не забудет «memset».
Конечно, вся эта структура выглядит так, как будто она должна быть базовым классом с виртуальными функциями, которые затем реализуются специально для любых других целей, которые у вас есть в производном классе. Но это не имеет ничего общего с использованием memset
в качестве таких.
Вы можете использовать memset в C ++, если хотите, но если вам нужен идиоматический метод C ++ для установки блока памяти, тогда вам нужен std :: fill.