Oh not so bad then, I can just add at the beginning...

typedef struct a *NeverUsedDefinition;

and now it's happy?  And that makes good coding how? If I never
actually use 'NeverUsedDefinition'?  Actually this 'feature' now
causes useless and unused declartions to be created.

On Thu, Jul 15, 2010 at 5:21 PM, J Decker <d3c...@gmail.com> wrote:
> 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