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ę

Dyrektywa #define

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

Postautor: Sławek5 » 27 lip 2006, o 05:48

Jeśli jest taki fragment kodu:

Kod: Zaznacz cały

#define JEST i++; \ tab[nr_zm]*=3; \ if(i>5) \ { \ nr_zm++; \ i=0; \ if(nr_zm>2) \ { \ return 1; \ } \ }
To jak to jest rozijane przez kompilator. Co w tym przypadku oznaczają znaki \

CZy mam to traktować jak makro

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

Postautor: bis » 27 lip 2006, o 07:16

Znak \ to konytnuacja linii. Tak, mozna to nazwać makrem. Jeżeli inne symbole nie są przedefiniowywane przez inne dyrektywy #define to kompilator całość traktuje jako jedną linię programu.

Kod: Zaznacz cały

i++;tab[nr_zm]*=3;if(i>5){nr_zm++;i=0;if(nr_zm>2){return 1;}}

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Sławek5 » 27 lip 2006, o 08:50

Ale czy znak \ ma jakieś wymagania tzn. czy po nim ma być [ENTER] czy może być spacja czy ma stać zaraz za instrukcją. Oraz czy to prawda, że w #define po instrukcjach nie może być spacji tzn.

Kod: Zaznacz cały

#define zwieksz i++;j++;
jest dobrze a

Kod: Zaznacz cały

#define zwieksz i++; j++;
jest źle

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

Postautor: bis » 27 lip 2006, o 11:07

to co jest definiowane przez #define dotyczy jednej lini programu(definicja kończy się na znaczniku nowej linii). Aby umozliwić skomplikowane zapisy wprowadzono znak kontynuacji \ który pozwala "zignorować" znacznik nowej linii i kontynuować definicję w nastepnej linii. Nie istnieje znak "ENTER" jet tylko znak CR (powrót karetki) i LF (nowy wiersz). W systemach wywodzących się z DOS ( a wczesniej CPM) koniec lini to są dwa znaki CR i LF, w systemach Unixowych koniec linii to jeden znak CR (to jest pępowina z czasów gdy konsolą do komputerów były dalekopisy, a te znaki bezpośrednio sterowały głowicą drukującą, osobna historia). Treść #define nie jest niczym ograniczona, możesz wstawiać dowolne napisy, w tym spacje i tabulacje, ale nie znaczniki nowej linii(chyba że kończysz definicję). po znaku \ napewno może być dowolna ilość spacji i tabulacji i tylko jeden znacznik końca linii,( jednoliniowy komentarz też może być). Dalej by mozna dzielić włos na czworo wyliczając różne możliwe zestawienia znaków i ich interpretacje ANSII oraz realizacje w różnych kompilatorach, ale to chyba jest bezsensowne.

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

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