• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Preprocesor - strażnik include

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
743 wizyt
pytanie zadane 2 sierpnia 2016 w C i C++ przez SebekMakaron Obywatel (1,290 p.)

Witam Podje dwa przykłady który z nich nie jest błędny?

PRZYKŁAD 1:

Plik "main.cpp"

#ifndef KALKULATOR_H_INCLUDED
#define KALKULATOR_H_INCLUDED

#endif // KALKULATOR_H_INCLUDED

Plik: "kalkulator.h

//Deklaracja funkcji...

 

PRZYKŁAD 2:

Plik "main.cpp"

#include "kalkulator.h"

Plik "kalkulator.h"

#ifndef KALKULATOR_H_INCLUDED
#define KALKULATOR_H_INCLUDED

//Deklaracja funkcji...

#endif // KALKULATOR_H_INCLUDED

 

2 odpowiedzi

+2 głosów
odpowiedź 2 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)
wybrane 2 sierpnia 2016 przez SebekMakaron
 
Najlepsza

Przykład pierwszy jest błędny.
Zapis:
#ifndef KALKULATOR_H_INCLUDED
#define KALKULATOR_H_INCLUDED
 ...
#endif // KALKULATOR_H_INCLUDED

stosuje się dla plików nagłówkowych (.h) gdzie znajdują się deklaracje funkcji, klas itd.
Mówiąc bardzo prostym językiem.. zabezpiecza on kompilator przed wielokrotną kompilacją tych samych plików podczas kompilacji.
A tłumacząc cały zapis.. jest to prosty if (tyle, że dla preprocesora), który można tłumaczyć tak:
#ifndef KALK_H //Jeżeli stała KALK_H nie została jeszcze zdefiniowana.. skompiluj kod do momentu gdzie znajduje się koniec if'a
#define KALK_H //Zdefiniuj/stwórz stałą o nazwie KALK_H.. teraz jeżeli przy kompilacji kompilator będzie spróbował go znów skompilować warunek nie zostanie spełniony.. stała KALK_H już została zdefiniowana.
 ...
#endif // KALK_H Koniec if'a.. a zapis w komentarzu KALK_H służy po to by nie pogubić się od czego ten if jest (jaki warunek ma tu swój koniec)
Ciekawostka:
Aktualnie wiele środowisk posiada pewną alternatywę i pozwala skrócić ten zapis do minimum.
Jeżeli na początku pliku nagłówkowego umieścimy zapis: #pragma_once
To otrzymamy taki sam efekt jakbyśmy zapisywali #ifndef, #define, #endif

komentarz 2 sierpnia 2016 przez SebekMakaron Obywatel (1,290 p.)
edycja 2 sierpnia 2016 przez SebekMakaron

Załóżmy taki przypadek, jest on niepoprawny pod względem przejrzystości ale chodzi mi o lepsze zrozumienie tego.

Plik "main.cpp"

#include <iostream>
#include "kalkulator.h"


#ifndef KALKULATOR_CPP
#define KALKULATOR_CPP

#include "kalkulator.h"

void Kalkulator()
{
     //kod
}
#endif // KALKULATOR_CPP

int main()
{
     Kalkulator();
     return 0;
}

Plik "kalkulator.h"

#ifndef KALKULATOR_H
#define KALKULATOR_H

void Kalkulator();

#endif //KALKULATOR_H

Pytanie:

Czy tylko jeden raz załączy się "kalkulator.h" do pliku "main.cpp"

 

0 głosów
odpowiedź 2 sierpnia 2016 przez MichuDev Pasjonat (20,300 p.)

Nie lepiej użyć na początku pliku nagłówkowego:

#pragma once

który dołącza plik tylko raz.

W ten sposób nie wyniknie konflikt nazw.

Lepiej używać tego by sprawdzić jaki to jest kompilator, system pod który kompilujemy lub konkretna wersja języka np. C++11, C++14, C++17.

 

komentarz 2 sierpnia 2016 przez Patrycjerz Mędrzec (192,320 p.)

Ten zapis nie jest częścią standardu języka i ogranicza pełną multiplatformowość kodu, jak i możliwość skompilowania go na każdym kompilatorze.

Oczywiście nie jest to absolutny argument przeciwko #pragma once, lecz należy o nim pamiętać.

komentarz 2 sierpnia 2016 przez MichuDev Pasjonat (20,300 p.)
Jednak większość dobrych kompilatorów posiada to zaimplementowane np. GCC, Microsoft Visual C++, Clang i wiele innych. Warto dodać, że te kompilatory wspierają praktycznie każdą platformę.
1
komentarz 2 sierpnia 2016 przez adrian17 Mentor (354,120 p.)

Warto dodać, że te kompilatory wspierają praktycznie każdą platformę.

(Zdecydowanie nie każdą, ale na takich platformach i tak nie ma co myśleć o multiplatformowości; pragma to ostatnie zmartwienie)

komentarz 2 sierpnia 2016 przez MichuDev Pasjonat (20,300 p.)
Masz rację, ale gdy pod wszystkie platformy pod jakie chcemy pisać posiadamy wspacie #pragma once to warto z tego użyć. W przeciwnym wypadku rozwiązanie z makrami jest konieczne.
komentarz 3 sierpnia 2016 przez adrian17 Mentor (354,120 p.)
...nie zrozumiałeś, zgodziłem się z Tobą.

Podobne pytania

0 głosów
2 odpowiedzi 317 wizyt
0 głosów
3 odpowiedzi 479 wizyt
pytanie zadane 13 listopada 2015 w C i C++ przez theseith Nowicjusz (160 p.)
0 głosów
1 odpowiedź 305 wizyt

93,440 zapytań

142,431 odpowiedzi

322,678 komentarzy

62,802 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...