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

Przestrzenie nazw, biblioteki .h

0 głosów
1,044 wizyt
pytanie zadane 25 sierpnia 2016 w C i C++ przez m_rij_v Użytkownik (660 p.)

Taki teks jest zawarty w lekcji o c++ na str.: http://cpp0x.pl/kursy/Kurs-C++/Przestrzenie-nazw/309

Pozostaje zapytać czy biblioteka #include <conio.h> także udostępniana jest w przestrzeni nazw? Odpowiedz brzmi nie. Ponieważ biblioteki, które posiadają rozszerzenie .h nie posiadają implementacji przestrzeni nazw.
Tutaj jedna uwaga, co nie znaczy, że ty nie możesz stworzyć takiego pliku.

I co z niego wynika? Tzn. w takim razie jak kompilator, czy też raczej komputer ,,wie" gdzie szukać funkcji , których używam z biblioteki np.: conio.h ? Skoro nie one nie posiadają implementacji przestrzeni nazw ?! To skąd on wie gdzie szukać znaczenia danej funkcji ? Bo w programie nie musze pisać using namespace conio.h; co też mnie zastanawia..Dlaczego nie trzeba?

2 odpowiedzi

+4 głosów
odpowiedź 25 sierpnia 2016 przez draghan VIP (106,230 p.)
wybrane 25 sierpnia 2016 przez m_rij_v
 
Najlepsza

Wygląda na to, że jeszcze nie do końca rozumiesz ideę przestrzeni nazw.

Plik conio.h to jest tylko plik - czyli fizyczne miejsce, w którym zapisany jest pewien fragment kodu źródłowego. To zupełnie inna sprawa, niż przestrzeń nazw - tutaj to już nie jest jakaś fizyczna przestrzeń, tylko nieco abstrakcyjna.

Możesz zdefiniować własną przestrzeń nazw, np. moja_przestrzen i w niej będą się zawierały Twoje funkcje i klasy, np.

// plik a.h
#pragma once

namespace moja_przestrzen
{
 class Klasa
 {
      public:
      Klasa();
 };
 double sin(double arg);
}

Możesz deklarację reszty swoich funkcji i klas mieć w innym pliku niż powyższe, ale nadal będą się one znajdować w Twojej przestrzeni nazw, oczywiście jeśli przydzielisz je do niej.

I jeśli tylko zaincludujesz w kodzie odpowiedni nagłówek, to będziesz miał dostęp do swoich funkcji czy klas, ujętych w przestrzeni moja_przestrzen.

#include <cmath>
#include <iostream>
#include "a.h"

int main()
{
    std::cout<<"Sinus z 3.14 z biblioteki standardowej: "<<std::sin(3.14)<<'\n';
    std::cout<<"Sinus z 3.14 z mojej biblioteki: "<<moja_przestrzen::sin(3.14);
    return 0;
}

Dla kompilatora nie ma żadnego znaczenia, czy Twój plik nagłówkowy to *.h, czy *.hpp. Dla niego liczy się tylko kod tam zawarty. Tak na marginesie - kompilator nawet nie ma pojęcia bladego o żadnych nagłówkach ani niczym takim - tym zajmuje się preprocesor.

Autorzy zrobili rozgraniczenie na pliki *.h i resztę ze względu korzeni języka C++. Nagłówek conio.h pochodzi jeszcze z C, gdzie nie istniał mechanizm przestrzeni nazw. Chodzi tutaj o bibliotekę standardową. Nagłówki *.h z biblioteki standardowej w C++ pochodzą z C i nie powinny być używane - teraz zastąpiły je odpowiednio nagłówki z "c" na początku i bez rozszerzenia, np.
math.h - nagłówek z C, niezalecany w C++
cmath - poprawny nagłówek dla C++

komentarz 25 sierpnia 2016 przez m_rij_v Użytkownik (660 p.)
Aaa trochę historii i wszystko jasne xd". Dzięki, jakoś połączyły mi się strzępki informacji i mam już (chyba) dobre wyobrażenie o tym ;].
+2 głosów
odpowiedź 25 sierpnia 2016 przez criss Mędrzec (172,570 p.)

Nie bardzo rozumiem o co ci chodzi. Jeśli coś nie jest w namespace-ie, to jest tzw. namespace-ie globalnym. Tzn. dostajesz się do tego bez konieczności żadnych operatorów zasięgu i deklaracji using. 

Ciekawostka (która może się w sumie kiedyś przydać):

Żeby mieć pewność, że używasz czegoś należącego do namespace-u globalnego, możesz poprzedzić nazwe elementu :: (dwoma dwukropkami - operatorem zasięgu ale pustym z lewej strony). Dzięki temu też możemy eliminować dwuznaczności. Np.:

namespace ns
{
    void f() { std::cout << "ns"; }
}

void f() { std::cout << 'g'; }

int main()
{

using namespace ns;

//f();   dwuznaczne - wywołujemy ns::f czy globalne f?
::f();

}


//output: g

 

Podobne pytania

0 głosów
1 odpowiedź 140 wizyt
pytanie zadane 22 listopada 2023 w C i C++ przez hutsalo1998 Użytkownik (540 p.)
0 głosów
2 odpowiedzi 707 wizyt
pytanie zadane 7 września 2015 w C i C++ przez 0xf Dyskutant (8,180 p.)
0 głosów
1 odpowiedź 148 wizyt
pytanie zadane 16 marca 2019 w C i C++ przez Michał_Warmuz Mądrala (5,830 p.)

93,424 zapytań

142,421 odpowiedzi

322,643 komentarzy

62,782 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...