سؤال

Are the types of these two declarations compatible types?

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

or similarly:

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

I'm having a hard time finding anything in the standard which covers the issue. I'm mostly interested in the topic of whether it's valid to manually prototype a function, omitting the restrict keyword, where the actual type might have restrict-qualified arguments depending on the version of C or version of other libraries in use.

هل كانت مفيدة؟

المحلول 2

C11 section 6.7.6.3 §15:

In the determination of type compatibility and of a composite type, each parameter declared with function or array type is taken as having the adjusted type and each parameter declared with qualified type is taken as having the unqualified version of its declared type.

نصائح أخرى

They are compatible:

(C99, 6.7.5.3 Function declarators (including prototypes) p15) "[...] (In the determination of type compatibility and of a composite type, each parameter declared with function or array type is taken as having the adjusted type and each parameter declared with qualified type is taken as having the unqualified version of its declared type.)"

The names of the arguments in the prototype doesn't matter, so these definitions are equivalent. However it's a good practice, to put the names, as these should give some idea what the arguments are intended for. Technically they are not need though, but serve as a documentation.

It is a different matter with the constqualifier, because this changes the meaning of the function.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top