首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在学术论文中遇到奇怪的C结构

在学术论文中遇到奇怪的C结构
EN

Stack Overflow用户
提问于 2010-08-07 14:53:46
回答 4查看 135关注 0票数 3

代码声明:

代码语言:javascript
复制
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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-07 14:58:28

这是个function pointer

函数指针的类型是R (*)(Args...),其中RArgs...被替换为返回类型和参数(如果有)。它被读作“一个指向接受参数Args...并返回R的函数的指针”。

您的代码会更容易阅读,如:

代码语言:javascript
复制
// 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

后来,它只是通过函数指针调用该函数。

票数 2
EN

Stack Overflow用户

发布于 2010-08-07 14:58:21

void (* log_msg)(char *msg)实际上是一个函数指针。您可以将其视为

代码语言:javascript
复制
typedef void (*LoggerFunctionPointer)(char* msg);

LoggerFunctionPointer log_msg = printf;

是的,它将log_msg映射到printf,但不是,log_msg不是一个函数,而是一个指向函数printf的指针。

使用函数指针的优点是可以在运行时切换log_msg。例如,可以在接口中提供一个开关,

代码语言:javascript
复制
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声明为

代码语言:javascript
复制
int (*log_msg)(const char*, ...) = printf;

)

票数 6
EN

Stack Overflow用户

发布于 2010-08-07 14:57:40

最上面的两行是建立一个函数指针(因此是*),该函数被命名为log_msg,然后将其设置为指向printf -之后,对log_msg的调用将以调用printf结束。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3429467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档