代码声明:
void (* log_msg)(char *msg)
=printf;
void change_and_log(int *buffer, int offset, int value){
buffer[offset] = value;
log_msg("changed");
}我最关心的是第一部分:
首先,签名void (* log_msg)(char *msg)是什么意思?这段代码是否简单地将函数log_msg映射到printf?在这种情况下,为什么函数名是(* log_msg)而不是简单的log_msg
发布于 2010-08-07 14:58:28
这是个function pointer。
函数指针的类型是R (*)(Args...),其中R和Args...被替换为返回类型和参数(如果有)。它被读作“一个指向接受参数Args...并返回R的函数的指针”。
您的代码会更容易阅读,如:
// print_function is a type that is a function pointer
typedef void (*print_function)(char *msg);
// log_msg is a variable of the type print_function: it points to a function
print_function log_msg = printf; // point to printf后来,它只是通过函数指针调用该函数。
发布于 2010-08-07 14:58:21
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;)
发布于 2010-08-07 14:57:40
最上面的两行是建立一个函数指针(因此是*),该函数被命名为log_msg,然后将其设置为指向printf -之后,对log_msg的调用将以调用printf结束。
https://stackoverflow.com/questions/3429467
复制相似问题