兼容类型和参数类型限定符

这两个声明的类型是否兼容?

void f(char *, char *); void f(char *restrict, char *restrict); 

或者类似的:

 void g(char *); void g(char *const); 

我很难找到涵盖问题的标准中的任何内容。 我最感兴趣的是关于手动原型化函数是否有效的主题,省略了restrict关键字,其中实际类型可能具有限制限定的参数,具体取决于C的版本或正在使用的其他库的版本。

C11第6.7.6.3节§15:

在确定类型兼容性和复合类型时,使用函数或数组类型声明的每个参数都被视为具有调整类型,并且使用限定类型声明的每个参数都被视为具有其声明类型的非限定版本

它们是兼​​容的:

(C99,6.7.5.3函数声明符(包括原型)p15)“[…](在确定类型兼容性和复合类型时,使用函数或数组类型声明的每个参数都被视为具有调整后的类型,每个使用限定类型声明的参数被视为具有其声明类型的非限定版本。)“

原型中的参数名称无关紧要,因此这些定义是等效的。 然而,将名称放在一起是一个很好的做法,因为这些应该可以让人知道参数的用途。 从技术上讲,他们不需要,但作为文档。

const限定符与此不同,因为这会改变函数的含义。