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

Preprocesor - strażnik include

Object Storage Arubacloud
0 głosów
475 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 Ekspert (344,860 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 Ekspert (344,860 p.)
...nie zrozumiałeś, zgodziłem się z Tobą.

Podobne pytania

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

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,965 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...