char vs char*
Ian Lance Taylor
iant@google.com
Tue Jun 15 19:01:00 GMT 2010
Todd Freed <todd.freed@gmail.com> writes:
> I don't know if this is a bug, but I suspect that it is.
>
> Consider the following two declarations, which compile fine:
>
> 1 static char __attribute__((weakref("LNU__strmats__LNU")))
> strmats(char* s, char* m, int* l, unsigned int options)
> __attribute__((nonnull));
> 2 static char* __attribute__((weakref("LNU__strmat__LNU")))
> strmat(char* s, char* m, int* l, unsigned int options)
> __attribute__((nonnull));
>
> Then, if I move the 'static' keyword, like so:
>
> 1 char static __attribute__((weakref("LNU__strmats__LNU")))
> strmats(char* s, char* m, int* l, unsigned int options)
> __attribute__((nonnull));
> 2 char* static __attribute__((weakref("LNU__strmat__LNU")))
> strmat(char* s, char* m, int* l, unsigned int options)
> __attribute__((nonnull));
>
> The 1st declaration still compiles, but the 2nd one fails like this:
>
> error.c:1: error: expected identifier or '(' before 'static'
This is standard C behaviour. Storage specifiers and type specifiers
may occur in any order. However, the '*' is a type declarator. A
type declarator is associated with a specific name being declared.
Type declarators must follow storage specifiers.
In other words, the failing example above fails for the same reason
that
char *a, b;
declares a to have type "char*" and b to have type "char".
Ian
More information about the Gcc-help
mailing list