#include és using namespace
2018-08-18T02:31:22+02:00
2018-08-21T09:06:28+02:00
2022-07-21T03:49:55+02:00
  • Ezt úgy lehet legjobban elképzelni, hogy van a dolog (függvény, osztály, stb.) teljes neve: pl. std:cin. Ez a hivatalos név: Kovács István. De ha használatba veszed az std névteret, akkor elég a rövid név: cin (a using namespace std után). Ilyenkor már "családon belül" vagy, elég a Pisti. Otthon nem szólítanak Kovács Istvánnak senkit... :)
    Mutasd a teljes hozzászólást!
  • A namespace az architektúra tagolására/megkülönböztetésére való, de ha egy központi headerben kinyírod egy using-al, akkor semmi értelme. Ezért a headerbe nem teszünk using namespace-t, inkább cpp-be. Sőt, ahol csak lehet headerben forward declaration legyen más headeres behúzások helyett. 17-től már kényelmesen lehet névterezni
    Mutasd a teljes hozzászólást!
  • pl ebben a draft-ban nem lennének benne, tehát ezek a nyelv részei.

    Az a draft két részből áll:
    - Clauses 2 through 16 describe the C++ programming language.
    - Clauses 18 through 30 and Annex D (the library clauses) describe the Standard C++ library.

    De lefordul, mivel a nyelv szabályrendszere alapján egyértelműen meghatároztad, hogy mit kell használnia.

    Így már igaz, viszont az előző hozzászólásodban te így fogalmaztál:

    így a kódodban nyugodtan írhatsz csak 'string'-et, mivel az 'std' névtérben megfogja találni. (Alapból nem keresi ott)
    Mutasd a teljes hozzászólást!
  • Nem érzem, hogy ezek a hozzászólás előre vinné a témát, de azért válaszolok.

    "A C++ Standard Library-ban léteznek ezek, a C++ egy programozási nyelv."
    Igen a programozási nyelv, mely előírja, hogy minek kell léteznie a C++ standard library-ban.

    Az std::string és az std::cin, meg hasonlók definiálva vannak a C++ nyelv által, ha nem így lenne, akkor pl ebben a draft-ban nem lennének benne, tehát ezek a nyelv részei.
    Working Draft, Standard for Programming Language C++

    "Ha így lenne akkor nem fordulna le az endl(std::cout) sem."
    De lefordul, mivel a nyelv szabályrendszere alapján egyértelműen meghatároztad, hogy mit kell használnia.
    (Ha nem lenne egyértelmű, akkor jön majd a fordítási hiba, hogy ambiguous overload)
    Mutasd a teljes hozzászólást!
  • C++-ban olyan osztály, hogy 'string', vagy olyan objektum, hogy 'cin' nem létezik.

    'std::string' és 'std::cin', na ilyenek már vannak.

    A C++ Standard Library-ban léteznek ezek, a C++ egy programozási nyelv.

    A fordítónak egyértelműen meg kell mondanod, hogy mit használsz.

    Ha így lenne akkor nem fordulna le az endl(std::cout) sem.
    Mutasd a teljes hozzászólást!
  • "ha nem használom az std namespacet"
    Használhatsz. Írj 'std::string'-et, vagy deklaráld, hogy az egész projektben mindenhol mindig használjuk az 'std::' névteret. (nem a legszerencsésebb)

    "Illetve mi van ha a using namespace-t rakok a headerbe?"
    Mindenhol, ahol include-olod a header-ed, ott érvényben marad a 'using namespace', ez problémákat okozhat.
    Mutasd a teljes hozzászólást!
  • De akkor a headerben hogy lehet mondjuk az egyik függvényemnek string típusú paramétere, ha nem használom az std namespacet? Illetve mi van ha a using namespace-t rakok a headerbe?
    Mutasd a teljes hozzászólást!
  • C++-ban olyan osztály, hogy 'string', vagy olyan objektum, hogy 'cin' nem létezik.

    'std::string' és 'std::cin', na ilyenek már vannak.
    A fordítónak egyértelműen meg kell mondanod, hogy mit használsz. Ezt megteheted úgy, hogy kézzel kiírsz mindent és úgy hivatkozol rá, vagy a 'using ' segítségével azt mondod a fordítónak, hogy névfeloldás során keressen az adott névtérben is, így a kódodban nyugodtan írhatsz csak 'string'-et, mivel az 'std' névtérben megfogja találni. (Alapból nem keresi ott)

    A névterek 'using'-al történő behúzásával vigyázni kell. Header-ben ne nagyon csinálj ilyesmit, de szerintem attól még messze vagy, hogy ebből gondod legyen, de jegyezd meg, mint ökölszabályt.
    Mutasd a teljes hozzászólást!
  • Rendkívül felületesen és pontatlanul megfogalmazva igen.
    Mutasd a teljes hozzászólást!
  • Igen időközben megértettem. De a namespace::fügvény ugyan azt csinálná mint az using namespace valami?
    Mutasd a teljes hozzászólást!
  • > De, mondjuk ha az <iostream> -et másolnám bele a kódomba, miért kell, hogy az std namespace-t használjam?

    Itt mit értesz 'használjam' alatt? A 'use std'-t, vagy a 'std::' prefix kiírását? A kettő közül valamelyikre szükség van, mivel az iostream-ben deklarált elemek a 'std' namespace-ben vannak. (Ami nem azonos a névtelen/default namespace-szel.)
    Mutasd a teljes hozzászólást!
  • Sziasztok,
    Van ugye az #include, és az using namespace. Utána olvasgattam, de még most sem világos. Az #include ugye annyit csinál, hogy a program lefutása előtt, az adott fájl tartalmát bemásolja a programkód elé. A namespaceket arra használjuk, hogy ha van 2 ugyan olyan nevű class, meg tudjuk különböztetni őket. De, mondjuk ha az <iostream> -et másolnám bele a kódomba, miért kell, hogy az std namespace-t használjam? És pl. a <string> include miért nem jó addig, amíg nem használom a namespace-t? Ha használom a namespacet, akkor oda kell írni hogy ValamilyenNamespace::Class, hogyha pl. class példányt hozok létre?
    Mutasd a teljes hozzászólást!
Címkék
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd