C jest w pewnym sensie, nie do końca, podzbiorem C ++. Więc możemy używać większości funkcji / nagłówków C w C ++, zmieniając nieco nazwę ( stdio.h
na cstdio
, stdlib.h
na cstdlib
).
Moje pytanie jest właściwie semantyczne. W kodzie C ++ (przy użyciu najnowszej wersji kompilatora GCC) mogę wywołać printf("Hello world!");
i std::printf("Hello world!");
działa dokładnie tak samo. W odnośniku, którego używam, pojawia się również jako std::printf("Hello world!");
.
Moje pytanie brzmi, czy preferowane jest używanie std::printf();
w C ++? Czy jest jakaś różnica?
c++
language-lawyer
std
DeiDei
źródło
źródło
C
symboli bibliotecznych do globalnej przestrzeni nazw, wolę używaćstd::
wersji z uprawnieniami. (Poza tym żałuję, że nie zrobili tego nielegalnie).Odpowiedzi:
Ze standardu C ++ 11 (wyróżnienie moje):
Używanie nagłówków „name.h” jest przestarzałe, zostały one zidentyfikowane jako kandydaci do usunięcia z przyszłych wersji.
Dlatego sugerowałbym dołączenie nagłówków „cname” oraz użycie deklaracji i definicji z
std
przestrzeni nazw.Jeśli z jakichś powodów musisz używać nagłówków «name.h» (są one przestarzałe, zobacz powyżej), sugerowałbym użycie deklaracji i definicji z globalnej przestrzeni nazw.
Innymi słowy: preferuj
nad
źródło
<cmeow>
zawsze zapewnia::std::purr
i może lub nie zapewnia::purr
.<meow.h>
zawsze zapewnia::purr
i może lub nie zapewnia::std::purr
.Skorzystaj z formularza, który gwarantuje dołączony nagłówek.
źródło
<cmeow>
nie wyświetla<meow.h>
ani,::std::purr
ani::purr
raczej błędu preprocesora. Tylko<cstdio>
i / lub<stdio.h>
zapewnia::std::printf
i / lub::printf
. : Pstrcat
wyprodukować::purr
.Nie, wszystko w porządku.
Oryginalny intencją było to, że
<___.h>
nagłówki byłoby wersje C, który postawił wszystko w globalnej przestrzeni nazw, a<c___>
nagłówki byłoby C ++ - Wersje IFIED, które miejsce wszystko wstd
przestrzeni nazw.W praktyce jednak wersje C ++ również umieszczają wszystko w globalnej przestrzeni nazw. I nie ma jasnego konsensusu, że używanie
std::
wersji jest „właściwą rzeczą”.Więc w zasadzie używaj tego, co wolisz. Najczęstszym jest prawdopodobnie użycie funkcji biblioteki standardowej C w globalnej przestrzeni nazw (
printf
zamiaststd::printf
), ale nie ma powodu, aby uważać jedną „lepszą” od drugiej.źródło
Jedyna różnica polega na tym, że
std::printf()
dodającstd::
rozwiązywanie zakresu, zabezpieczysz się przed pisaniem funkcji o tej samej nazwie w przyszłości, co doprowadziłoby do konfliktu przestrzeni nazw. Oba zastosowania doprowadzą do dokładnie tych samych wywołań API systemu operacyjnego (możesz to sprawdzić pod Linuksem, uruchamiającstrace your_program
).Uważam, że jest bardzo mało prawdopodobne, aby ktoś nazwał taką funkcję, ponieważ
printf()
jest to jedna z najczęściej używanych funkcji. Ponadto w C ++iostream
s są preferowane zamiast wywołańcstdio
funkcji takich jak printf.źródło
printf
jest bardzo zepsuty w C ++ z powodu braku silnego pisania, zastąpienie go lepszą wersją jest całkiem naturalne.std::printf
różni się odmynamespace::printf
, a C ++ wyraźnie pozwala mi definiować własne funkcje, których nazwy stanowią cień tych z funkcji wewnątrzstd
. To po prostu nie podlega dyskusji. Jeśli chodzi o twoje twierdzenia, któreprintf
są wydajne z powodu luźnego pisania, oczywiście jest to również błędne.printf
nie jest nawet szczególnie wydajne, istnieje wiele bardziej wydajnych implementacji, które są silnie wpisane.Ze standardu C ++ 11:
Więc jeśli używasz
<cstdio>
, możesz być pewien, żeprintf
będzie to wnamespace std
, a więc nie w globalnej przestrzeni nazw.Używanie globalnej przestrzeni nazw powoduje konflikt nazw. To nie jest sposób C ++.
Dlatego używam
<cstdio>
nagłówków i radzę to zrobić.źródło
<cstdio>
masz gwarancję, że std :: printf będzie istnieć, ale nie ma gwarancji ze strony standardu, czy :: printf również będzie istnieć lub nie będzie. W rzeczywistości, w każdym kompilatorze, o którym kiedykolwiek słyszałem, :: printf jest wstawiany do globalnej przestrzeni nazw, kiedy dołączasz<cstdio>
.Z mojej własnej praktyki: używaj
std::
przedrostków. W przeciwnym razie jeden dzieńabs
będzie cię ugryźć bardzo boleśnie w przypadku, gdy za pomocą punktów pływających.Niekwalifikowany
abs
odnosi się do funkcji zdefiniowanejint
na niektórych platformach. Na innych jest przeciążony. Jednakstd::abs
jest zawsze przeciążony dla wszystkich typów.źródło
Używanie po prostu
printf
bezstd::
może generować konflikty nazw i jest uważane za złą praktykę przez wielu programistów C ++. Google jest twoim przyjacielem w tej sprawie, ale oto kilka linków, mam nadzieję, że to pomożeDlaczego „używanie std przestrzeni nazw” jest uważane za złą praktykę? http://www.cplusplus.com/forum/beginner/61121/
źródło
using namespace std
jest złą praktyką, ale używanieprintf
bezstd::
kwalifikatora nie.using namespace std;
to nie jest mój problem. Nigdy tego nie używam.printf();
istd::printf();
pracować w C ++ bezusing namespace std;
Dlatego zadałem pytanie.std::printf
, wydaje się po prostu dziwne.W stdio
Więc nie powinno to robić żadnej różnicy.
źródło