函数指针变量声明中有错字,但代码可以编译

时间:2018-11-17 09:24:46

标签: c function-pointers

在回答question about function pointers时,OP这样做是为了声明一个函数指针,该函数指针带有1个整数参数并且不返回任何内容:

void *(intr_handlerptr)(int);  // wrong but compiles!!
intr_handlerptr = intr_handler;  // compiler error: cannot assign to this weird thing (lvalue required as left operand of assignment)

正确的声明是

void (*intr_handlerptr)(int);  // correct

有趣的是,错误是在分配给该函数指针时发生的,而不是在声明时发生的(使用gcc 7.3.1测试)

那第一行是做什么的?

1 个答案:

答案 0 :(得分:2)

表达式void *(intr_handlerptr)(int);读为“ intr_handlerptr是一个函数,它将一个int并返回一个指向未命名事物的指针(一个void指针)。因此,函数名称周围的括号没有用处,并且被丢弃了,这是一个原型。

表达式void (*intr_handlerptr)(int);读为“ intr_handlerptr是指向一个带有int且不返回任何内容的函数的指针。必须使用括号将名称与指针类型相关联。这是一个变量。” / p>

分配给第一个时,编译器会抱怨您试图分配给“ nothing”,因为左侧符号不是变量。实际上,编译器在其符号表中仅知道该名称的原型。当然,第二个赋值语句是正确的,因为您正在分配一个变量。