Deklareringar av structs och typedefs i filer

Permalänk

Deklareringar av structs och typedefs i filer

Två funktioner (read o write) i filen readwrite.c läser en fil med keys och parametrar av olika types (double, int, strings och char). Read-funktionen är av void * typ och jag gör en typecast i anropande program för att få rätt värde.
Frågan kommer nu till typedef struct. Hur ska header-filen se ut till den C-fil som innehåller read(), write() ?

Headern rwinifile.h ser ut som följer:

#ifndef / #define.
typedef struct { .... } vars;
extern void *read()
extern void *write()
#define Macro1 .............
#define Macro2 .............
#endif

I bägge filerna (main.c och readwrite.c) har jag #include "rwinifile.h"

Överst i filen readwrite.c har jag definitionen vars filparametrar;.
I yttersta nivån i main() har jag deklarering extern vars filparametrar;

Ser detta rätt ut? Kompilatorn gcc gnäller inte trots -pedantic och allt funkar men ibland har komp. inte riktigt varnat för div. formella felaktigheter. Jag måste få detta rätt.
Därför frågar jag. Tacksam för feedback.

edit: Lite idiotisk tråd men ni kanske hittar nåt jag inte tänkt på eller vet.

Permalänk
Medlem

@Sweedland:

Nu är jag inte helt hundra på om jag tolkat dig rätt med hur du typecastar för att få rätt värde. Men jag gör ett försök:

När du använder

extern

så talar du om för kompilatorn att
- "Lyssna noga, den här variabeln/funktionen kommer att användas någonstans i mina filer. När du ska länka ihop allt sen får du leta efter var den är definierad. Så gnäll inte så fort du inte hittar den eller om du hittar flera stycken (d.v.s. error: undefined ...)".
Varpå kompilatorn svarar:
"Lovar du att jag hittar den sen när jag länkar ihop allt?"
- "Ja jag lovar." => Det är nu du skriver extern och alla är glada.

Så först måste du använda extern sedan måste du definiera den någonstans i någon fil (spelar ingen roll var) och till sist kan du använda den. Kompilatorn kommer se att du använder den och hitta "källan". Det är viktigt att extern och definieringen sker i file-scope. D.v.s. INTE inuti en funktion.

Exempel:

#ifndef / #define. typedef struct { .... } vars; extern void *read() // <---- Alla filer, i alla scopes, som inkluderar den här header-filen kommer att ha tillgång till den här. extern void *write() // <---- Den här också. MEN, de måste definieras någonstans innan de kan används överallt. #define Macro1 ............. #define Macro2 ............. #endif

readwrite.c

#include "rwinifile.h" void* read(); // Måste definieras för att användas void* write(); // .... // kod ....

randomfile.c

#include "rwinifile.h" void *read() { // kod } void *write() { // kod }

main.c

#include "rwinifile.h" // .... // kod .... void file(); void file() { char *text = "Hejhej"; read(); // <---- inuti function-scope (eller local-scope som jag kallar det, vet dock inte om det är korrekt term) write(); // <------ Kan hittas här } int main() { // kod read(); // Här också file(); }

Linking: main.c readwrite.c randomfile.c => Kompilatorn letar igenom alla dessa tre filer och kopplar ihop hur det ska vara.

Reserverar mig för fel. Om det är något som inte stämmer så säg gärna till. Är som sagt inte helt hundra på detta

Permalänk

Du skriver void file(); före def av file(). Är det verkligen nödvändigt? Def. kommer före användningen i main(). Som sagt, deklareringar i C är nödvändigtvis inte självklart i alla lägen.

I header-filen finns structen där jag också typedeffar den.

typedef struct fileparams
{
char u__str[100];
long int u__int;
unsigned char u__char;
double u__double;
int err;
} uv;

Sen typecastar jag returvärdet från void *read() genom ett macro. Dessa macron finns också i header-filen.

#define PARAM_RDBL(FILE,KEY) *(double*)read_param(FILE, KEY)
#define PARAM_RINT(FILE,KEY) *(long int*)read_param(FILE, KEY)
#define PARAM_RSTR(FILE,KEY) (char*)read_param(FILE, KEY)
#define PARAM_RCHR(FILE,KEY) *(char*)read_param(FILE, KEY)

Utanpå detta har jag också kommentarstext och det föregås med första tecken som mellanslag eller #.

PS/ Kod i era kommentarer är speciellt markerade. Hur görs det? Försökte hitta nån knapp men hittar inte nåt sånt.

Permalänk
Medlem
Skrivet av Sweedland:

Du skriver void file(); före def av file(). Är det verkligen nödvändigt? Def. kommer före användningen i main(). Som sagt, deklareringar i C är nödvändigtvis inte självklart i alla lägen.

I header-filen finns structen där jag också typedeffar den.

typedef struct fileparams
{
char u__str[100];
long int u__int;
unsigned char u__char;
double u__double;
int err;
} uv;

Sen typecastar jag returvärdet från void *read() genom ett macro. Dessa macron finns också i header-filen.

#define PARAM_RDBL(FILE,KEY) *(double*)read_param(FILE, KEY)
#define PARAM_RINT(FILE,KEY) *(long int*)read_param(FILE, KEY)
#define PARAM_RSTR(FILE,KEY) (char*)read_param(FILE, KEY)
#define PARAM_RCHR(FILE,KEY) *(char*)read_param(FILE, KEY)

Utanpå detta har jag också kommentarstext och det föregås med första tecken som mellanslag eller #.

PS/ Kod i era kommentarer är speciellt markerade. Hur görs det? Försökte hitta nån knapp men hittar inte nåt sånt.

I detta fall är det inte nödvändigt. Men om man skulle vilja använda file() inuti t.ex. readwrite.c så är det nödvändigt. Tog bara med den funktionen som ett exempel och lät den ligga kvar i main.c.

Jaha då är med på hur det ser ut. Den enda haken jag kan komma på såhär sent på natten är om du, av någon anledning, skulle få för dig att vilja kasta till typerna A, B, C... o.s.v. I det fallet kanske det blir lite osmidigt. Med expanderingen tänker jag på. Men bortsett från det så ser det bra ut.
Om det bara är dessa 4 typer så är det ju inga problem. Bara köra på!

Permalänk
Medlem
Skrivet av Sweedland:

PS/ Kod i era kommentarer är speciellt markerade. Hur görs det? Försökte hitta nån knapp men hittar inte nåt sånt.

[code]
Kod här
[/code]

Se detta inlägg om vilka taggar som finns.