www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C-Files aufsplitten


Autor: bool (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo

ich habe eine relativ grosses C-File und möchte es in zwei separate 
C-Files (Main.c und Uart.c) aufsplitten. Wird die Deklarierung (#ifndef 
uart_h
#define uart_h
#endif
 -->"uart.h")
 genauso wie bei Header Files gemacht oder muss man was beachten?

Gruss

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein.
Aber du bist nicht der Erste, der sowas will.
Schau doch einfach mal, wie andere das machen...  :-/

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

uart.h:
#ifndef __UART_H__
#define __UART_H__

#define BAUDRATE      115200
#define RXEN          2
#define TXEN          3

int Uart_Init(int baudRate);
int Uart_GetChar(void);
int Uart_PutChar(int c);

...

#endif


uart.c:
int Uart_Init(int baudRate)
{

  return(success);
}

int Uart_GetChar(void)
{
  return(c);
}

int Uart_PutChar(int c)
{
  return(c);
}

main.h:
#ifndef __MAIN_H__
#define __MAIN_H__

#define CLK    72000000
...

#endif

main.c:
#include <stdio.h>
#include "main.h"
#include "uart.h"


void main()
{
  Uart_Init();

  while(1)
  {
    ;
  }

}

Hi,

hier haste ein (hoffe ich) sauberes Konstrukt für den Aufbau 
verschiedener Files.
Ich bevorzuge ein Pärchen aus .c/.h File pro Peripheral (also Treiber) 
bzw. Funktionsgruppe.
So wird dein Programm wunderbar modular, und du kannst alle Module aus 
.c/.h wiederverwenden.

Ausnahme sind z.B. eine GPIO.h, wo die Pin #defines gemacht werden, die 
dann in der uart.h mit #include-iert werden.


Also, copy&paste, und gleich beim sauberen Stil bleiben!


VG,
/th.

Autor: einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kannst du mir noch erklären was
#ifndef _UART_H_
#define _UART_H_

genau bedeutet und für was es gebraucht wird?

danke!

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

das ist ganz einfach:

Der C Präprozessor nimmt alles, was als
#include "fileName"
angegeben ist, und packt es in genau der Reihenfolge in seinem 
temporären "file" über das C file, was er gerade bearbeitet, und macht 
danach die Ersetzungen

Also z.b.
#define UART_BAUDRATE     115200

Uart_Init(UART_BAUDRATE);

wird
Uart_Init(115200);

Damit man das ganze steuern kann, gibt es so was wie anfragen:
#if
#else
#elsif
#endif
#ifndef
#ifdef
...

Wenn du ein Symbol abfragst, definierst, was definitiv noch nicht da 
ist, und es dann definierst, ist es in diesem kontext vorhanden.
Die präpro wird TRUE, und er macht alles, was zwischen #ifndef und 
#endif steht.
#ifndef __UART_H__
#define __UART_H__

#endif

Solltest du durch ein anderes Headerfile, was im gleichen kontext 
compiliert wird, das gleiche noch mal includen, wären Symbole doppelt.
Das wird hier verhindert, da beim zweiten Lauf das Symbol (
__UART_H__
) definiert ist.

Daher habe ich mir für die Headerfile-#ifndef (if not defined) die 
Nomenklatur
__FILENAME_H__
ausgedacht, da das eigentlich immer unique ist.


VG,
/th.

Autor: einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, vielen dank für deine ausführungen!

Autor: JJJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Immer wieder brauchbar: http://www.wachtler.de/ck/

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.