关于函数指针的声明

Bin*_*eee 0 c function-pointers

我正在考虑以下两者之间的区别:

void *signal(int, void (*)(int))(int)
Run Code Online (Sandbox Code Playgroud)

void (*signal(int, void (*)(int)))(int)
Run Code Online (Sandbox Code Playgroud)

我知道后者来自这里 - 示例#3:"终极"(当我试着大声说出来理解它时,这是一次热闹的学习经历):

signal是一个函数(int, void (*)(int))作为输入并返回一个指向另一个获取(int)和返回的函数的指针void.

对于前者我认为,因为最后一个(int)会有更高的优先级,*所以它应该是语法错误,但是从cdecl.org,结果是:

["]声明信号为函数(int,指向函数的函数(int)返回void)返回函数(int)返回指向void [."]的指针

所以我需要一张支票.

Mic*_*zel 6

人们必须区分语法和语义.cdecl.org只给出你输入的声明器的语法含义.在你的第一个例子中,你确实有一个语法正确的声明signal作为函数返回一个函数.但是,C不允许函数返回其他函数:

N15706.7.6.3§1:

函数声明符不应指定函数类型或数组类型的返回类型.

因此,虽然此声明在语法上是正确的,但它在语义上是无效的.换句话说:虽然C语法可以编写"函数返回函数",但是不允许实际拥有一个在程序中返回函数的函数.就像英语(或任何语言)也允许你表达各种实际上无法实现的想法......