Initialisieren von variablen mit PIC mcu's
-
Hallo ich muss mal wieder die "C" Nerd's nerven
Ich programmiere Microchip Mcu's mit xc8 8bit ich konnte, meine variablen
im header so konfigurieren.like
int _4ms =4;nun bin ich auf 32 bit PIC32 umgestiegen der gleich compiler ccc nur mit 32bit
nun muss ich
extern int _40us ;in den Header schreiben
und
int _40us = 40 im
xxx.c file;Kann mir das jemand erklären
Ich habe just for fun eine Test Var im Header angelegt
mit der Compiler Meldung.
c:/microchip/harmony/v1_07_01/framework/driver/tmr/drv_tmr_compatibility.h:96: multiple definition ofTest' build/default/production/\_ext/977502197/drv\_spi\_tasks.o:c:/microchip/harmony/v1\_07\_01/apps/mulitimerapp/firmware/src/system\_config/default/framework/driver/spi/dynamic/drv\_spi\_tasks.c:52: first defined here build/default/production/\_ext/1271179505/sys\_devcon.o: In function
SYS_DEVCON_TraceDisable':
c:/microchip/harmony/v1_07_01/framework/system/devcon/src/sys_devcon.c:104: multiple definition of `Test'
-
Jede .c Datei wird für sich seperat übersetzt. Davor werden noch die mit #include angegebenen Dateien eingesetzt.
Die fertig überstzten Dateien (Objektdateien, .o oder .obj) werden dann vom Linker zum ausführbaren Programm/Bibliothek gebunden.Wenn du jetzt deinen Header in mehreren .c einbindest, wird jedesmal eine neue Variable (mit demselben Namen) definiert.
Der Linker hat jetzt Probleme, weil er nicht weiß, welche Variable gemeint ist.
Definitionen (Variablen und Funktionen) gehören in die .c
Deklarationen gehören in den Header.
(War schon immer so)
-
foo.h
int foo = 42;
foo.c
#include "foo.h"
bar.c
#include "foo.h"
führt dazu, daß
foo
in den Übersetzungseinheitenfoo.c
undbar.c
definiert sind. Damit ist die One Definition Rule verletzt.foo.h
extern int foo;
foo.c
#include "foo.h" int foo = 42
bar.c
#include "foo.h"
foo
ist nur in der Übersetzungseinheitfoo.c
definiert. --> Alles gut.
-
Ich danke Euch
Gut werde ich nie in "C" aber es macht die Sache einfacher mit MCU'S
Danke