Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2013-02

Forward struct declaration in C

4 messages · 3 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Unknown author

Hi,

I'm porting a piece of software to FPC but I got stuck at a forward struct declaration. The situation is as folows.

Header 1 declares:
    struct TaskHandle__;
    typedef void (*CallBackProcPtr)(struct TaskHandle__ *task);

And Header2 provdes:
typedef struct TaskHandle__ { int unused; } *TaskHandle

However header 2 already references header 1 because it already contains some other type definitions, so I cannot reference header 2 in header 1 because of a circular dependency. Can FPC do something similar to C and define a forward record?

Regards, Darius

Reply by email

Sven Barth
to Unknown author
Show quoted text 16 lines
Hi, I'm porting a piece of software to FPC but I got stuck at a forward struct declaration. The situation is as folows. Header 1 declares: struct TaskHandle__; typedef void (*CallBackProcPtr)(struct TaskHandle__ *task); And Header2 provdes: typedef struct TaskHandle__ { int unused; } *TaskHandle However header 2 already references header 1 because it already contains some other type definitions, so I cannot reference header 2 in header 1 because of a circular dependency. Can FPC do something similar to C and define a forward record?

A: You could move the declaration of TaskHandle__ to a common unit which is used by the other two units.

B: As the TaskHandle__ type seems rather simple move it to the Header 1 unit with a comment "was originally declared in Header 1" (because Header 2 already uses Header 1)

C: You could treat the "task" parmeter for the callback simply as a pointer... (of course you reduce static typing with this)

Regards,
Sven

Reply by email

Michael Van Canneyt
to Unknown author: I'm porting a piece of software to FPC but I got stuck at a forward struct declaration.…
Show quoted text 16 lines
Hi, I'm porting a piece of software to FPC but I got stuck at a forward struct declaration. The situation is as folows. Header 1 declares: struct TaskHandle__; typedef void (*CallBackProcPtr)(struct TaskHandle__ *task); And Header2 provdes: typedef struct TaskHandle__ { int unused; } *TaskHandle However header 2 already references header 1 because it already contains some other type definitions, so I cannot reference header 2 in header 1 because of a circular dependency. Can FPC do something similar to C and define a forward record?

No. What you can do is merge the headers in a single unit: PTaskHandle__ = ^TTaskHandle__;
and define TTaskHandle__ in the same block

The CallBackProcPtr only needs a pointer, so you could also simply define a pointer.

Michael.

Reply by email

Unknown author
to Sven Barth: A: You could move the declaration of TaskHandle__ to a common unit which is used by the…

Thanks Sven and Michael,

I will do as you proposed and simply use a pointer for now. Later once the code has been ported I will have a look to refactor the code.

Regards, Darius

Show quoted text 35 lines
On 22.02.2013 09:57, wrote: > Hi, > > I'm porting a piece of software to FPC but I got stuck at a forward > struct > declaration. The situation is as folows. > > Header 1 declares: > struct TaskHandle__; > typedef void (*CallBackProcPtr)(struct TaskHandle__ *task); > > And Header2 provdes: > typedef struct TaskHandle__ { int unused; } *TaskHandle > > However header 2 already references header 1 because it already contains > some other type definitions, so I cannot reference header 2 in header 1 > because of a circular dependency. Can FPC do something similar to C and > define a forward record? A: You could move the declaration of TaskHandle__ to a common unit which is used by the other two units. B: As the TaskHandle__ type seems rather simple move it to the Header 1 unit with a comment "was originally declared in Header 1" (because Header 2 already uses Header 1) C: You could treat the "task" parmeter for the callback simply as a pointer... (of course you reduce static typing with this) Regards, Sven _______________________________________________ fpc-pascal maillist - http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply by email