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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 18 kwi 2025, o 03:53


    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: 27373
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27373
    Lokalizacja: Szczecin
    Pomógł: 1043

    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 4 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