Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

zastosowanie #define i składnia

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:
zastosowanie #define i składnia

Postautor: Sławek5 » 5 lis 2006, o 06:33

CZeść.
Chciałem się zapytać o składnie #define
Jeżeli mam napisane (trzy przypadki):

Kod: Zaznacz cały

1. #define del250() {asm volatile(("nop"::) ; } 2. #define SET_CS1() (LCD_CTRL_PORT |= (1 << LCD_CS1P)) #define CLR_CS1() (LCD_CTRL_PORT &= ~(1 << LCD_CS1P)) 3. #define LCD_NOCS() SET_CS1();CLR_CS21();
To chodzi mi o
1. nawiasy za definicjami np SET_CS1()
czy sa one konieczne czy muszą się pojawić i czy mogę je ominąć.

2. użycie tutaj średnika. np. w przypadku 2 na końcu instrukcji go nie mam czyli w wywołaniu powienien się pojawić SET_CS1(); (ze średnikiem) a jeżeli jak w przypadku 3 lub 1 są one już podczas definiowania wyrażenia użyte to czy też trzeba przy wywołaniu stosować.
Jeżeli w przypadku 3 jest połączenie dwóch poprezdnich definicji ktore nie mają średnika to połączenie w jedną wydaję się że jest potrzebne ale jak bym w punkcie 2 wstawił średnik to czy połączeniu 3 też by musiał być?

Awatar użytkownika
bis
-
-
Posty:134
Rejestracja:12 maja 2005, o 08:11
Lokalizacja:Warszawa

Postautor: bis » 5 lis 2006, o 15:22

W każdym przypadku możesz to zrobić.
Inną sprawą jest używanie ich po takich modyfikacjach. Jezyk C jest bardzo elastyczny i wraz z możliwościami preprocesora pozwala na na naprawdę różne "sztuczki". Jest nawet taki konkurs na "dziwacznie" zakodowane programy. Najczęściej takie makra wprowadza się aby ułatwić sobie pisanie i przeglądanie programu, albo aby uzyskac efekt funkcji "in-line"(zapewne dla przyspieszenia wykonywania tego fragmentu kodu). Każde z proponowanych przez Ciebie "usprawnień" kodu makr ostatecznie "zaciemni" rzeczywistą strukturę programu, a jestem pewien że za pare miesięcy nie będziesz pamiętał czym jest ten napis w kodzie programu

Kod: Zaznacz cały

printf(...); SET_CS1; while(1) {.......
jest jakąś stałą czy generuje kawałek kodu równoważny funkcji "in-line". Dodając jeszcze drobny mętlik związany z tym że jakieś linie programu mają lub nie kończący je średnik, zapewnisz sobie długie chwile poszukiwań co jest czym i co naprawdę oznacza. Tak naprawdę jest to kwestia stylu kodowania. Na własne potrzeby można sobie robić co się chce, ale jeżeli przyjdzie potrzeba podzielenia sie tym lub konsultacji z innymi programistami to styl kodowania może wręcz uniemożliwić znalezienie wspólnej płaszczyzny porozumienia.
bis

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 5 lis 2006, o 20:15

No... to ze swojej strony moge dodac tyle:
Jak zapewne wiesz, dyrektywa define ma postac
$define wyrazenie ciag znakow zastepujacych to wyrazenie
Gdzie wyrazenie, to nazwa jaka chcesz nadac, zakonczona bialym znakiem (np. spacja). Kazde nastepne wystapienie wyrazenia w kodzie, zostanie zastapione przez ciag znakow zastepujacych to wyrazenie ... w ktorym moga juz wystapowac biale znaki, konczy sie zas wraz z koncem linii *)
Zwroc uwage, ze nie jest analizowane co Ty tam wpiszesz... poprostu jest wstawiane w kod "jak jest".

Zastanowmy sie wiec co bedzie jesli uzyjemy:

Kod: Zaznacz cały

#define CZTERY 4; for (int x=1; i<CZTERY; i++);
Jak bedzie wygladal powyzszy kod po wstawkach preprocesora ??

Oczywiscie bedze skutkowac bledem, bo bedzie to:

Kod: Zaznacz cały

for (int x=1; i<4; ; i++);
To moze inny przyklad, co sie stanie jak dasz taka dyrektywe

Kod: Zaznacz cały

#define CZTERY 4 //ta dyrektywa wstawia wartosc 4
Moze odrazu jej rozwiniete uzycie (jak w pierwszym forze):

Kod: Zaznacz cały

for (int x=1; i<4 //ta dyrektywa wstawia wartosc 4; i++);
czyli znow blad, bo za '4' zaczyna sie komentarz, konczacy sie wraz z koncem linii, dlatego bezpieczniej jest uzywac w define komentarzy '/* komentarz */' nawet jesli mialaby to byc jeda krotka fraza.

I moze jeszcze jeden przyklad

Kod: Zaznacz cały

#define WITAJ printf("Witaj szkolo") /* Ten przyklad umozliwi bardziej elastyczne uzycie WITAJ */ WITAJ; // 1) int x=WITAJ; // 2) if (int y=WITAJ) printf("\n no i wyswietlilismy %d znakow", y);
Ten ostatni zapis nie byl by oczywiscie mozliwy, gdyby uzyc srednika juz w define, dwom pierwszym srednik juz w dyrektywie by nie przeszkadzal.



*) Mozna rozciagnac na wiecej linii, wykozystujac znak '\'

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość