#define w bibliotekach

0

Witam,
chciałbym w pliku nagłówkowym zapisać stałą #definie i używać jej w pliku c, jednak występuje błąd.

main.c:
//------------------------------------------------------------------------------
#include <avr/io.h>

#include "lib.h"

int main(void)
{
    while(1)
    {
        //TODO:: Please write your application code 
    }
}
//------------------------------------------------------------------------------

lib.h:
//------------------------------------------------------------------------------
#ifndef LIB_H_
#define LIB_H_

#define PORT PORTA

void funkcja(void);

#endif /* LIB_H_ */
//------------------------------------------------------------------------------

lib.c:
//------------------------------------------------------------------------------
void funkcja(void)
{
	PORT = 23;
}
//------------------------------------------------------------------------------

Podczas kompilacji wyskakuje błąd:

Error	1	'PORT' undeclared (first use in this function)	C:\Users\xxx\Documents\AVRStudio\AVRGCC2\AVRGCC2\lib.c
Error	2	each undeclared identifier is reported only once for each function it appears in	C:\Users\xxx\Documents\AVRStudio\AVRGCC2\AVRGCC2\lib.c

Błąd znika kiedy dodam #include "lib.h" do lib.c, jednak wydaje mi się iż dodawanie własnego pliku nagłówkowego jest dziwne przynajmniej, szczególnie kiedy przeczytałem że #definie powinny znajdywać się w plikach h (http://cpp0x.pl/kursy/Kurs-C++/Dzielenie-kodu-na-kilka-plikow-zrodlowych/310).

Korzystam z Atmel AVR Studio 5 (Version: 5.0.1163)
AVR GCC 8-bit Toolchain
Version: gcc version 4.5.1 (AVR_8_bit_GNU_Toolchain_3.2.3_315)

1

w c/c++ #define'a możesz sobie wsadzić i wewnątrz .c/.cpp (nawet wewnątrz funkcji).
Tutaj masz błędy takiego typu:
1)NIGDZIE nie ma tej dyrektywy #define PORT 23
2)Poczytaj jak działają makra,bo operacja PORT=23 to nie pójdzie-port NIE JEST zmienną,tylko makrem którego wystąpienia w kodzie zostaną zastąpione na pałę tekstem znajdującym się po spacji tuż przed kompilacją(w moim przypadku będzie to 23);

0

Dzięki, miałem jednak nadzieje że makra dołączane są tak jak zmienne, funkcje.

0

Ależ są:
plik.h

#define PORT 23

plik.c

#include "plik.h"

void someFunction(void)
{
    setPortNumber(PORT);//a jej deklaracja to void setPortNumber(int portNumber);
}
0

Poczytaj jak działają makra,bo operacja PORT=23 to nie pójdzie-port NIE JEST zmienną,tylko makrem którego wystąpienia w kodzie zostaną zastąpione na pałę tekstem znajdującym się po spacji tuż przed kompilacją(w moim przypadku będzie to 23);

to akurat dobrze robi, PORTA jest rejestrem procesora AVR, a pytający chce sobie „zmienić nazwę” na po prostu PORT. tak to przynajmniej zrozumiałem.
jedyne czego brakowało to właśnie tego #include "lib.h" w lib.c

0

a plik lib.h nie bedzie w takim przypadku dwa razy włączony do kompilacji?

main.c -> lib.h
           |
           +-> lib.c -> lib.h
0

właśnie dlatego używa się tego

#ifndef LIB_H_
#define LIB_H_
cała treść pliku
#endif

za pierwszym inkludem LIB_H_ nie jest zdefiniowane, więc zostaje zdefiniowane i cała treść pliku wchodzi. za drugim LIB_H_ jest już zdefiniowane, więc cała treść pliku jest przeskakiwana.

0

Kompilacja wygląda raczej tak:

main.c -> lib.h -> main.obj
lib.c -> lib.h -> lib.obj

a potem linker: main.exe -> lib.obj + main.obj

1 użytkowników online, w tym zalogowanych: 0, gości: 1