Kezdőoldal » Számítástechnika » Programozás » C++: Miért nem kell minden...

C++: Miért nem kell minden függvénynél megadni az std:: névteret?

Figyelt kérdés

Ez a kód:

#include <cstdlib>

#include <ctime>

#include <iostream>

int main()

{

srand((unsigned) time(0));

std::cout << rand() % 6;

}


A kérdésem arra vonatkozik, hogy a srand() és a time() előtt miért nem kell megadni az std:: névteret?

Azt értem, hogy a rand()-nál miért nem kell, ott

operator<<(std::cout, rand() % 6);

lesz belőle, így működik az ADL. De az első sornál nem.



#C++ #Argument-dependent lookup
2021. júl. 14. 15:04
 1/9 anonim ***** válasza:
7%
Ha el akarod kerülni a folytonos std:: zast csak ír d be az includok utan hogy using namespace std
2021. júl. 14. 15:13
Hasznos számodra ez a válasz?
 2/9 A kérdező kommentje:
1-es: tudom, de nem ez a kérdés.
2021. júl. 14. 15:14
 3/9 anonim ***** válasza:
100%

"operator<<(std::cout, rand() % 6);"


Itt az ADL nem azt jelenti, hogy a rand-nál nem kell, hanem azt, hogy az operátornál nem kell kiírni. Ugye a globális névtérben nincs operator<<(std::ostream&, int), azonban mivel egyik argumentumnak az std::cout van megadva így megfogja találni az std::operator<<(std::ostream&, int) függvényt.


A rand és az srand C-s függvény, ugyan amikor a <cstdlib> headert includolod akkor lesz std::rand és std::srand is, de a szabvány szerint megvan engedve, hogy ezeket a függvényeket beemelje a globális névtérbe, ezért tudod std nélkül is használni.


Külön megjegyzés a rand/sranddal kapcsolatban a cppreference oldalról (ha nem megy az angol a google fordító változat is érhető, persze tanulásnál nincs semmi gond ennek használatával, de jó tudni):


"There are no guarantees as to the quality of the random sequence produced. In the past, some implementations of rand() have had serious shortcomings in the randomness, distribution and period of the sequence produced (in one well-known example, the low-order bit simply alternated between 1 and 0 between calls).


rand() is not recommended for serious random-number generation needs. It is recommended to use C++11's random number generation facilities to replace rand(). (since C++11)"

2021. júl. 14. 16:58
Hasznos számodra ez a válasz?
 4/9 anonim ***** válasza:
Mert nem az std névtérben vannak.
2021. júl. 14. 22:07
Hasznos számodra ez a válasz?
 5/9 A kérdező kommentje:

#3: Köszönöm, ezen a nyomon el lehet indulni:

"A rand és az srand C-s függvény, ugyan amikor a <cstdlib> headert includolod akkor lesz std::rand és std::srand is, de a szabvány szerint megvan engedve, hogy ezeket a függvényeket beemelje a globális névtérbe, ezért tudod std nélkül is használni."

Ezt egyébként honnan lehet tudni? A cppreference is csak mint std::rand hivatkozik ezekre a függvényekre és itt sem találtam erre utalást:

[link]


Köszönöm az ADL-lel kapcsolatos kijavítást is, azt valóban rosszul értettem.

2021. júl. 15. 09:48
 6/9 anonim ***** válasza:
5: a régi c-s rand, amit te hívsz meg az std::rand az két külön függvény.
2021. júl. 15. 10:36
Hasznos számodra ez a válasz?
 7/9 A kérdező kommentje:
#5: igen, ez már kiderült, de hol van ez leírva?
2021. júl. 15. 12:35
 8/9 anonim ***** válasza:

"[Example: The header <cstdlib> assuredly provides its declarations and definitions within the namespace std. It may also provide these names within the global namespace. The header <stdlib.h> assuredly provides the same declarations and definitions within the global namespace, much as in the C Standard. It may also provide these names within the namespace std. — end example ]"

Forrás: [link] | 1312. oldal, 3-4 bekezdés.


Szóval amikor a cstdlib-et includolod nem kötelező, hogy elérhető legyen a globális névtérből, így attól függően, hogy neked az adott OP rendszeren, adott fordítóval elérhető std nélkül, nem garantálja, hogy minden platformon így lesz. Ha pedig a sima C-s headert (stdlib.h) includolod akkor pont fordítva van, globális névtérben biztos lesz, az std-ben opcionális.

2021. júl. 15. 13:43
Hasznos számodra ez a válasz?
 9/9 A kérdező kommentje:

Köszönöm, így már világos.

Egyébként egy angol nyelvű tutorial alapján haladok, de vannak benne ilyen megmagyarázatlanul hagyott dolgok. Van amire találtam máshol magyarázatot, de ez így sehol nem volt leírva, szóval nagyon hasznosak voltak a válaszaid.

2021. júl. 15. 14:54

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!