Forum: Mikrocontroller und Digitale Elektronik einfaches include #define Problem


von prinz3nroll3 (Gast)


Lesenswert?

Hallo,
leider hat die Suche nichts auf Anhieb rausgespuckt.

hier mein problem:

file.h
#ifdef VAR_PLACE_ROM
   #define VAR_PLACE romdata
#else
   #define VAR_PLACE idata
#endif
void test(void);
------

file.c
#pragma VAR_PLACE unsigned char testvar;
void test(void)
{
;
}
-------

main.c
#define VAR_PLACE_ROM
#include "file.h"

void main(void)
{


}
------------

Die variable liegt immer im idata und nicht im rom
-> er kennt die Definition nicht wieso?
muss ich in file.h die main.c bzw. die Datei mit dem define einbinden?
Das wäre schlecht wenn ja die file.h ein Teil einer Library wäre und in 
verschiedenen Projekten eingebunden wird.

Wo ist mein Denkfehler?

Vielen dank für die Antworten!

Gruß

von Rolf Magnus (Gast)


Lesenswert?

> -> er kennt die Definition nicht wieso?

Er kennt sie schon - in main.c, dann da steht sie ja. In file.c aber 
nicht.

von prinz3nroll3 (Gast)


Lesenswert?

hallo,
danke für die antwort.

nur wie löst man denn ein solches problem?

ich habe gedacht durch das include kennt file.h das define.

vielen dank

von mati (Gast)


Lesenswert?

Hallo,

verschiebe die Definition #define VAR_PLACE_ROM an den Anfang der 
file.h.

bei einer Lib stehst Du aber auf dem Schlauch. Eine Lib ist beim 
Einbinden bereits kompiliert und der Datentyp Deiner Variable schon 
fest.

von Rolf Magnus (Gast)


Lesenswert?

> ich habe gedacht durch das include kennt file.h das define.

Ja, aber eben nur in main.c. Der Header wird ja durch das #include nicht 
verändert. Er wird beim compilieren von file.c so wie er ist 
eingebunden, und da dort dann das #define nirgends steht, ist es in 
file.c auch nicht vorhanden.

> nur wie löst man denn ein solches problem?

Das #define im Header oder über die Kommandozeile übergeben, und zwar 
auch beim compilieren von file.c.

von prinz3nroll3 (Gast)


Lesenswert?

mati schrieb:
> bei einer Lib stehst Du aber auf dem Schlauch. Eine Lib ist beim
> Einbinden bereits kompiliert und der Datentyp Deiner Variable schon
> fest.

Hallo,
danke für die Antworten.
Die file.h wird in verschiedenen Porjekten eingebunden.
Je nach Projekt soll die Variable im rom oder ram liegen,
dies soll in den projekten selbst defeniert werden und nicht im file.h.


vielen dank für die zahlreichen antworten

gruß

von Karl H. (kbuchegg)


Lesenswert?

prinz3nroll3 schrieb:
> mati schrieb:
>> bei einer Lib stehst Du aber auf dem Schlauch. Eine Lib ist beim
>> Einbinden bereits kompiliert und der Datentyp Deiner Variable schon
>> fest.
>
> Hallo,
> danke für die Antworten.
> Die file.h wird in verschiedenen Porjekten eingebunden.

Was hilft dir das?
Es geht ja nicht um die file.h
Es geht auch nicht um die main.c

Es geht um die file.c!
Und die ist bereits compiliert worden, wenn du sie in die Library 
einbindest. Damit ist in der Library schon fest fixiert, wie file.c das 
VAR_PLACE_ROM aufgefasst hat, wenn sie der eigentliche Programmierer in 
die Finger bekommt.

Nichts geht mehr.

> Je nach Projekt soll die Variable im rom oder ram liegen,
> dies soll in den projekten selbst defeniert werden und nicht im file.h.

Dann musst du dir einen Mechanismus einfallen lassen, wie du den 
Funktionen in file.c diese Entscheidung mitteilen kannst. Und zwar 
nachdem file.c compiliert wurde.

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
Noch kein Account? Hier anmelden.