Bei der Anweisung
macht der Preprozessor nichts anderes, als den ganzen Inhalt von time.h
an dieser Stelle in main.c einzufügen. Erst danach sieht der Compiler
den Code. Es macht hier also keinen Unterschied, ob etwas in main.c oder
in time.h steht, denn es ist für den Compiler nicht zu unterscheiden.
Du bekommst allerdings ein Problem, wenn Du time.h in eine zweite
C-Datei (z.B. modul2.c) inkludierst. Dann steht da nämlich nochmal die
Definition der Variable, der Funktion und der ISR. Darüber wird sich der
Linker beschweren, denn jede Funktion darf nur einmal definiert werden.
Der richtige Weg ist, aus Deiner time.h eine time.c zu machen und eine
neue time.h zu erstellen, dir nur Deklarationen enthält, die ein anderes
Modul (main.c) kennen muss, um die Funktionalität nutzen zu können.
1 | // time.h
|
2 | uint16_t time_ms(void);
|
3 |
|
4 | // time.c
|
5 | static volatile uint16_t ms;
|
6 |
|
7 | ISR(/* ... */)
|
8 | {
|
9 | ms++;
|
10 | }
|
11 |
|
12 | uint16_t time_ms(void) { return ms; }
|
Ich habe noch zwei Änderungen vorgenommen:
1. Die Variable "_ms" static gemacht (und das Unterstrich-Prefix
entfernt, das ist nämlich für die C-Standardbibliothek reserviert).
Dadurch kann sie nur von Funktionen aus time.c verwendet werden. Von
main.c aus ist sie nicht sichtbar. Das war ja Deine ursprüngliche Frage.
2. Der Funktion "ms" das Prefix "time_" gegeben. Somit kann man sofort
erkennen, zu welchem Modul diese Funktion gehört. Gewöhn Dir am besten
gleich an, dass alle Funktionen, die in einer H-Datei aufgeführt sind,
das gleiche Prefix haben. Ansonsten wirst Du schnell den Überblick
verlierten und die Gefahr von unbeabsichtigten Namenkollisionen steigt.