Header-filer (Filnamn.h) i C

Här diskuteras programmering och utveckling
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Header-filer (Filnamn.h) i C

Inlägg av Johnny Rosenberg »

Håller på och leker lite med C igen och som vanligt går det inget vidare. Eller det går bra, men det känns inte som att jag hanterar det hela optimalt. Det handlar återigen om att fördela saker på flera filer. Använder enbart en vanlig textredigerare (gedit) och kör make manuellt i ett terminalfönster. Den biten fungerar utmärkt. Filerna kompileras som de ska och länkas på rätt sätt.

Vad jag funderar på är vad som är ”god programmering” eller vad man ska kalla det. Jag hittar på ett exempel:

Kod: Markera allt

#include <stdio.h>

double MyFunction(double, int);

int 
main (int argc, char *argv[])
{
	double x;
	x=MyFunction(0.47,44100);
	printf("%f\n",x);
	return 0;
}

double MyFunction(double a, int b){
	return(a*b);
}
Här är det bara en fil och allt fungerar som det ska. Inga konstigheter.
Nu delar jag upp det på flera filer. Här är main.c:

Kod: Markera allt

#include "MyApp.h"

int 
main (int argc, char *argv[])
{
	MyApp();
	return 0;
}
MyApp.c:

Kod: Markera allt

#include <stdio.h>
#include "MyApp.h"

void MyApp(void){
	double x;
	x=MyFunction(0.47,44100);
	printf("%f\n",x);
}
MyApp.h:

Kod: Markera allt

#include "MyFunctions.h"
MyFunctions.c:

Kod: Markera allt

#include "MyFunctions.h"

double MyFunction(double a, int b){
	return(a*b);
}
MyFunctions.h:

Kod: Markera allt

double MyFunction(double, int);
Nu skrev jag bara på här så jag har inte testat ovanstående, men det borde ju funka om jag inte klantat till det rejält här.

Som alla kan se så har jag varit tvungen att ha med raden ”#include "MyFunctions.h"” i två olika filer för att det hela ska fungera. Finns det något skäl till att inte ha med samma include-rad på fler än ett ställe? Det vill säga, är detta ”dålig programmering” på något sätt? Om så, varför och hur bör man hellre göra?

Detta exempel kanske ser lite konstigt ut, exempelvis med en .h-fil som bara refererar till en annan .h-fil, men tanken är ju att programmet ska vara lite mer omfattande än att multiplicera två tal, så detta är bara en illustration. Ville ha ett så enkelt exempel som möjligt som ändå illustrerar användandet av flera filer.

Frågan gäller alltså inte om detta är ”god programmering” vad gäller just detta exempel, utan mer generellt.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Christian Johansson
Inlägg: 1235
Blev medlem: 17 feb 2007, 20:31
OS: Xubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Eslöv

Re: Header-filer (Filnamn.h) i C

Inlägg av Christian Johansson »

Jag hade flyttat raden

Kod: Markera allt

#include "MyFunctions.h"
från filen MyApp.h till filen MyApp.c för #include-direktivet behövs bara i MyApp.c där man använder funktionen MyFunctions.

Sedan saknas deklaration av funktionen MyApp. Filen MyApp.h behöver innehålla:

Kod: Markera allt

void MyApp(void);
Nej, det är vanligt att göra #include på samma h-fil på flera ställen så det är inte dålig programmering. Man brukar dock ha ett skydd i h-filer på följande sätt så att man inte får byggfel om att man försöker definiera saker flera gånger:

Kod: Markera allt

//MyApp.h
#ifndef MYAPP_H
#define MYAPP_H

// Definera innehållet i filen här.

#endif // #ifndef MYAPP_H
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Header-filer (Filnamn.h) i C

Inlägg av Johnny Rosenberg »

Christian Johansson skrev:Jag hade flyttat raden

Kod: Markera allt

#include "MyFunctions.h"
från filen MyApp.h till filen MyApp.c för #include-direktivet behövs bara i MyApp.c där man använder funktionen MyFunctions.
I detta fall hade jag gjort likadant, men jag ville vara lite mer generell i detta exempel. Givetvis har jag tänkt mig att MyApp.h (och alla andra filer) ska innehålla en massa annat också. Därför tänkte jag att alla include-satser för MyApp.c skulle befinna sig i MyApp.h, även om det bara var en enda i just detta förenklade fallet.
Christian Johansson skrev:Sedan saknas deklaration av funktionen MyApp. Filen MyApp.h behöver innehålla:

Kod: Markera allt

void MyApp(void);
Jag var nog för snabb där. Slarvfel får vi kalla det. Hade jag bemödat mig med att provköra hade jag nog hittat det så småningom…
Dock har jag märkt att gcc inte protesterar om den saknas. Man får bara lite märkliga resultat när man kör, i alla fall i mina enkla exempel som jag testat.
Christian Johansson skrev:Nej, det är vanligt att göra #include på samma h-fil på flera ställen så det är inte dålig programmering. Man brukar dock ha ett skydd i h-filer på följande sätt så att man inte får byggfel om att man försöker definiera saker flera gånger:

Kod: Markera allt

//MyApp.h
#ifndef MYAPP_H
#define MYAPP_H

// Definera innehållet i filen här.

#endif // #ifndef MYAPP_H
Jo, det där har jag ju sett i diverse kod som jag har studera lite på ytan. Det kanske kan vara vettigt att göra så i mitt fall också (alltså i det projekt jag egentligen försöker utföra, inte detta enkla exempel), åtminstone i de header-filer som jag vet anropas från flera filer. Fast egentligen skadar det kanske inte att jämt göra så…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Skriv svar

Återgå till "Programmering och webbdesign"