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

时间:2013-08-13 17:38:44

标签: c language-lawyer restrict-qualifier

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

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

或类似地:

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

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

3 个答案:

答案 0 :(得分:5)

它们兼容:

  

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

答案 1 :(得分:4)

C11第6.7.6.3节§15:

  

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

答案 2 :(得分:1)

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

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