On Thu, Jul 15, 2010 at 5:32 PM, Dave Korn <dave.korn.cyg...@gmail.com> wrote:
> On 16/07/2010 00:59, J Decker wrote:
>
>> ------------------------------
>>
>> #define PointerA struct a *
>>
>> void f( PointerA );
>>
>> typedef struct a * PA;
>> struct a { int x; };
>>
>> void f( PA a )
>> {
>> }
>>
>> ---------------------------------
>>
>> This is the output
>>
>>  warning: 'struct a' declared inside parameter list
>>  warning: its scope is only this definition or declaration, which is
>> probably not what you want
>> error: conflicting types for 'f'
>>  note: previous declaration of 'f' was here
>>
>>
>> --------------------------------
>>
>> This is valid C code by every other compiler.
>
>  Not so, as far as I can tell.  Comeau online says:
>
>> Comeau C/C++ 4.3.10.1 (Oct  6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
>> Copyright 1988-2008 Comeau Computing.  All rights reserved.
>> MODE:strict errors C99
>>
>> "ComeauTest.c", line 3: warning: declaration is not visible outside of 
>> function
>>   void f( PointerA );
>>           ^
>>
>> "ComeauTest.c", line 8: error: declaration is incompatible with "void 
>> f(struct a *)"
>>           (declared at line 3)
>>   void f( PA a )
>>        ^
>>
>> 1 error detected in the compilation of "ComeauTest.c".
>
>  As long as "struct a" hasn't been (forward-)declared at the time the
> declaration of f() is found, it is a different one from the "struct a" in the
> global namespace that the formal parameter on the definition of f() then
> subsequently refers to.
>

Okay so if I just move the typedef up... (which isn't exactly feasible
in the actual project)


>>
>> #define PointerA struct a *
>>
>> typedef struct a * PA;
>> void f( PointerA );
>>
>> struct a { int x; };
>>
>> void f( PA a )
>> {
>> }

Now it's happy, why can't it just define 'struct a' as an appropriate
name as it used to, the strucutre still isn't defined.

(okay every other compiler I mention is MSVC, OpenWatcom, lcc, and gcc
before now)

>    cheers,
>      DaveK
>
>

Reply via email to