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
Nein. Aber du bist nicht der Erste, der sowas will. Schau doch einfach mal, wie andere das machen... :-/
Hi, uart.h:
1 | #ifndef __UART_H__
|
2 | #define __UART_H__
|
3 | |
4 | #define BAUDRATE 115200
|
5 | #define RXEN 2
|
6 | #define TXEN 3
|
7 | |
8 | int Uart_Init(int baudRate); |
9 | int Uart_GetChar(void); |
10 | int Uart_PutChar(int c); |
11 | |
12 | ...
|
13 | |
14 | #endif
|
uart.c:
1 | int Uart_Init(int baudRate) |
2 | {
|
3 | |
4 | return(success); |
5 | }
|
6 | |
7 | int Uart_GetChar(void) |
8 | {
|
9 | return(c); |
10 | }
|
11 | |
12 | int Uart_PutChar(int c) |
13 | {
|
14 | return(c); |
15 | }
|
main.h:
1 | #ifndef __MAIN_H__
|
2 | #define __MAIN_H__
|
3 | |
4 | #define CLK 72000000
|
5 | ...
|
6 | |
7 | #endif
|
main.c:
1 | #include <stdio.h> |
2 | #include "main.h" |
3 | #include "uart.h" |
4 | |
5 | |
6 | void main() |
7 | {
|
8 | Uart_Init(); |
9 | |
10 | while(1) |
11 | {
|
12 | ;
|
13 | }
|
14 | |
15 | }
|
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.
kannst du mir noch erklären was #ifndef _UART_H_ #define _UART_H_ genau bedeutet und für was es gebraucht wird? danke!
Hi, das ist ganz einfach: Der C Präprozessor nimmt alles, was als
1 | #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.
1 | #define UART_BAUDRATE 115200
|
2 | |
3 | Uart_Init(UART_BAUDRATE); |
wird
1 | Uart_Init(115200); |
Damit man das ganze steuern kann, gibt es so was wie anfragen:
1 | #if
|
2 | #else
|
3 | #elsif
|
4 | #endif
|
5 | #ifndef
|
6 | #ifdef
|
7 | ...
|
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.
1 | #ifndef __UART_H__
|
2 | #define __UART_H__
|
3 | |
4 | #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 (
1 | __UART_H__
|
) definiert ist. Daher habe ich mir für die Headerfile-#ifndef (if not defined) die Nomenklatur
1 | __FILENAME_H__
|
ausgedacht, da das eigentlich immer unique ist. VG, /th.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.