void (* log_msg)(char *msg)
фактически указатель на функцию.Вы можете просмотреть это как
typedef void (*LoggerFunctionPointer)(char* msg);
LoggerFunctionPointer log_msg = printf;
Да, оно отображает log_msg
на printf
, но нет, log_msg
не функция, а указатель, указывающий на функцию printf
.
Использование указателя функции имеет то преимущество, что log_msg
можно переключать во время выполнения.Например, вы могли бы предоставить переключатель в интерфейсе, который
void no_log_msg(char* msg) {}
...
if (enable_debug) {
log_msg = printf;
} else {
log_msg = no_log_msg;
}
, тогда, без изменения другого исходного кода, вся регистрация может быть заблокирована.неверно, поскольку подпись printf
равна int printf(const char*, ...)
. Чтобы избежать неявного приведения, log_msg
следует объявить как
int (*log_msg)(const char*, ...) = printf;
)