Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 19 kwi 2024, o 02:39


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 25 kwi 2012, o 09:47 
Offline
Nowy

Dołączył(a): 23 mar 2012
Posty: 6
Pomógł: 0

W przykładach z płyty dołączonych do książki Mirka pojawiają się 3 różne formy nazywania makra przy sprawdzaniu czy plik *.h został już dołączony (tzw. include guard).
Żeby było łatwiej podam przykłady z podaniem numeru programu:

Program 03_Multi_LED - #ifndef _d_led_h
Program 04_LCD - #ifndef LCD_H_
Program 20_ETH_serwer_www - #ifndef IP_CONFIG_H

Może to problem czysto akademicki ;) ale chciałbym zapytać bardziej obeznanych w programowaniu, czy to w jakim "formacie" nazwiemy makro ma jakieś znaczenie praktyczne? Czy któryś sposób jest bardziej ;) zalecany od innego? Z informacji znalezionych w sieci, spotkałem się jedynie z informacją, że nazwa ze znakiem podkreślenia z przodu jest niezalecana.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2012, o 10:05 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

No masz zupełną rację że w tym przypadku jest to problem absolutnie czysto akademicki ;)

To co tu jest robione to przede wszystkim nie jest makro :(

definicja makra może wyglądać np tak:

Kod:
#define MAX(a,b) ((a>b)?a:b)


albo chociażby tak:

Kod:
#define LED_ON PORTB |= (1<<PB1)


natomiast to co stosujemy do zabezpieczania plików nagłówkowych przed ich jakby rekurencyjnym wczytywaniem to jest definiowanie NAZWY jakiejś tam stałej nazwy (definicji) na potrzeby tylko i wyłącznie preprocesora. To nigdy nie weźmie udziału kompilacji

#define ALA_I_AS

dlatego z punktu widzenia definiowania takich nazw na potrzeby zabezpieczeń plików nagłówkowych przed ich ponownym wczytywaniem do kodu - stosujemy nazwy, które ot po prostu kojarzą się z nazwą pliku ale równie dobrze mogłaby to być nazwa ALA_I_AS zamiast np IP_CONFIG_H ;)

z tego punktu widzenia w ogóle jest nieistotne czy podkreślnik wystąpi na początku tej nazwy czy nie - to po prostu ma być nazwa - która nigdy przypadkiem nie powtórzy się w innym pliku nagłówkowych w ramach ochrony przed tym wczytywaniem. Zatem jeśli przyjmiemy zasadę że będziemy te nazwy tworzyć od nazw plików czy z podkreślinikami w środku czy na początku czy na końcu - to nie ma żadnego znaczenia.....

równie dobrze możnaby przyjąć inną chociaż dużo brzydszą zasadę że będziemy nadawać nazwy związane z godziną i sekundami gdy tworzymy taki nowy plik np:

Kod:
#ifnndef _12_33_18


;) tyle że to brzydko a jak widzimy nazwę związaną z nazwą pliku to od razu dla oka lepiej no się nie pomyli

---------------

natomiast to co słyszałeś z podkreślnikami - to po prostu tworząc zmienne w programie nie nadużywaj podkreślnika na pczątku ale tu chodzi raczej też o porządek i zasadę niż o strach że coś złego się stanie. Łatwo bowiem pomylić przy różnych krojach fontów/czcionek np czy dałeś jeden czy dwa podkreślniki i za chwilę tobie samemu będzie się mieszało

jeśli już używamy to dla jakichś na prawdę bardzo specyficznych celów - np gdy chcemy zachować ciągłość nazwy wskaźnika, który przekazywany jest jako argument a ma odzwierciedlać jakąś zmienną np:

Kod:
uint8_t zmienna;

void fun( uint8_t * _zmienna );


wtedy wewnątrz funkcji będę wiedział okiem że _zmienna to wskaźnik a nie jej instancja fizyczna np w obszarze zmiennych globalnych. To jest oczywiście tylko bardzo prosty poglądowy przykład a nie praktyczny.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2012, o 11:28 
Offline
Nowy

Dołączył(a): 23 mar 2012
Posty: 6
Pomógł: 0

Dzięki za szybką odpowiedź.

Co do tego, że to nie makro, to zgadzam się całkowicie. Gdy szukałem informacji w sieci, na niektórych stronach było to nazwane makro i tak jakoś utkwiło ;-)

A co do podkreślenia przed nazwą to to co znalazłem dotyczyło właśnie definicji preprocesora (źródło - http://stackoverflow.com/questions/2939368/best-practice-on-c-header-files-with-ifndef-define-endif pierwsza odpowiedź pod pytaniem):

"Identifiers starting with a _ is reserved for the implementation/compiler, so don't use that."

Co do nazywania zmiennych to wiem, że jedną z umownych konwencji jest, że nazwy zmiennych prywatnych w klasie powinny zaczynać się od podkreślenia. Ale to umowne konwencje, a problem, którym rozpocząłem watek jest przecież czysto akademicki ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2012, o 12:25 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

psi napisał(a):
D
"Identifiers starting with a _ is reserved for the implementation/compiler, so don't use that."


No tak - dokładnie - ale to się też jakby sprowadza do tego co pisałem - bo to że są zarezerwowane nie oznacza że ich użycie coś popsuje - jedynie dla oka naszego mogą się mylić czasem nazwy gdybyśmy je zbyt często stosowali w programie z podkreślnikiem na początku.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 5 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO