这两个声明的类型是否兼容?
void f(char *, char *);
void f(char *restrict, char *restrict);
或类似地:
void g(char *);
void g(char *const);
我很难在标准中找到涵盖该问题的任何内容。我最感兴趣的主题是手动原型化函数是否有效,省略了restrict关键字,其中实际类型可能具有限制限定的参数,具体取决于C的版本或正在使用的其他库的版本。
这两个声明的类型是否兼容?
void f(char *, char *);
void f(char *restrict, char *restrict);
或类似地:
void g(char *);
void g(char *const);
我很难在标准中找到涵盖该问题的任何内容。我最感兴趣的主题是手动原型化函数是否有效,省略了restrict关键字,其中实际类型可能具有限制限定的参数,具体取决于C的版本或正在使用的其他库的版本。
它们是兼容的:
(C99, 6.7.5.3 函数声明符(包括原型) p15)“[...] (在确定类型兼容性和复合类型时,以函数或数组类型声明的每个参数都被视为具有调整后的类型并且使用限定类型声明的参数被视为具有其声明类型的非限定版本。)"
C11 第 6.7.6.3 节第 15 节:
在确定类型兼容性和复合类型时,每个声明为函数或数组类型的参数都被视为具有调整后的类型,而每个声明为限定类型的参数都被视为具有其声明类型的非限定版本。
原型中参数的名称无关紧要,因此这些定义是等价的。但是,输入名称是一种很好的做法,因为这些名称应该可以说明参数的用途。从技术上讲,它们虽然不是必需的,但可以用作文档。
限定符是另一回事const
,因为这改变了函数的含义。