Gdy używamy nagłówków C w C++, powinniśmy używać funkcji z STD:: lub globalnej przestrzeni nazw?
C jest w pewnym sensie, nie do końca, podzbiorem C++. Możemy więc używać większości funkcji / nagłówków C w C++ zmieniając nieco nazwę (stdio.h
Na cstdio
, stdlib.h
do 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!);
i działa dokładnie tak samo. A w referencji, której używam, pojawia się również jako std::printf("Hello world!);
.
Moje pytanie brzmi, czy lepiej używać std::printf();
w C++? Jest jakaś różnica?
8 answers
Ze standardu C++11 (podkreślenie):
D. 5 C nagłówki biblioteki standardowej [depr.C. nagłówki]
- dla kompatybilności z biblioteką standardową C...
- każdy nagłówek C, z którego każdy ma nazwę postaci name.h , zachowuje się tak, jakby każda nazwa umieszczona w standardzie przestrzeń nazw biblioteki za pomocą odpowiedniego nagłówka cnamejest umieszczana w obszarze globalnej przestrzeni nazw. Jest nieokreślone, czy te nazwy są najpierw zadeklarowane lub zdefiniowane w przestrzeni nazw (3.3.6) z przestrzeni nazw std i są następnie wstrzykiwane do globalnego zakresu przestrzeni nazw poprzez jawne deklaracje using-declarations (7.3.3).
- przykład: nagłówek
<cstdlib>
z pewnością dostarcza swoje deklaracje i definicje w przestrzeni nazwstd
. Może również dostarczyć te nazwy w globalnej przestrzeni nazw. Nagłówek<stdlib.h>
z pewnością zapewnia to samo deklaracje i definicje w globalnej przestrzeni nazw , podobnie jak w standardzie C. Informatyka może również podać te nazwy w przestrzeni nazwstd
.
Używając " nazwa.nagłówki h " są przestarzałe, zostały zidentyfikowane jako kandydaci do usunięcia z przyszłych wersji.
Sugerowałbym więc włączenie nagłówków "cname" i użycie deklaracji i definicji z przestrzeni nazw std
.
Jeśli musisz użyć " nazwa.H " nagłówki dla niektórych powody (jest przestarzałe, patrz wyżej), sugerowałbym użycie deklaracji i definicji z globalnej przestrzeni nazw.
Innymi słowy: preferuj
#include <cstdio>
int main() {
std::printf("Hello world\n");
}
Over
#include <stdio.h>
int main() {
printf("Hello world\n");
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-02 20:12:27
<cmeow>
zawsze podaje ::std::purr
i może, ale nie musi, podać ::purr
.
<meow.h>
zawsze podaje ::purr
i może, ale nie musi, podać ::std::purr
.
Użyj formularza, który jest gwarantowany przez dołączony nagłówek.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-16 10:35:38
Tak czy siak, nic Ci nie będzie.
Oryginalny był intencją, że nagłówki <___.h>
będą wersjami C, które umieszczają wszystko w globalnej przestrzeni nazw, a Nagłówki <c___>
będą wersjami C++-ified, które umieszczają wszystko w std
przestrzeni nazw.
W praktyce jednak wersje C++ również umieszczają wszystko w globalnej przestrzeni nazw. I nie ma wyraźnego konsensusu, że używanie wersji std::
jest "właściwą rzeczą do zrobienia".
Więc zasadniczo, Użyj, co wolisz. Najpowszechniejsze jest prawdopodobnie używanie funkcji biblioteki standardowej C w globalnej przestrzeni nazw (printf
zamiast std::printf
), ale nie ma powodu, aby uważać jedną za "lepszą" od drugiej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-16 10:39:03
Jedyną różnicą jest to, że w std::printf()
dodając std::
scope resolution zabezpieczysz się przed kimś piszącym funkcję o tej samej nazwie w przyszłości, co doprowadziłoby do konfliktu przestrzeni nazw. Oba zastosowania prowadzą do dokładnie tych samych wywołań API systemu operacyjnego (możesz to sprawdzić pod Linuksem, uruchamiając strace your_program
).
Uważam za mało prawdopodobne, aby ktoś nazwał taką funkcję, ponieważ printf()
jest jedną z najczęściej używanych funkcji. Również w C++, iostream
S są preffered na wywołania do funkcji cstdio
, takich jak printf.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-16 10:38:11
Ze standardu C++11:
Każdy nagłówek C, z którego każdy ma nazwę formularza name.h, zachowuje się jakby każda nazwa umieszczona w przestrzeni nazw biblioteki standardowej przez odpowiedni nagłówek cname jest umieszczony w globalnej przestrzeni nazw zakres. Nie jest sprecyzowane, czy nazwy te są po raz pierwszy deklarowane, czy zdefiniowane w przestrzeni nazw (3.3.6) std i są następnie wtryskiwany do globalnego zakresu przestrzeni nazw przez jawne using-deklaracje (7.3.3).
Jeśli więc użyjesz <cstdio>
, możesz być pewien, że printf
będzie w namespace std
, a więc nie w globalnej przestrzeni nazw.
Użycie globalnej przestrzeni nazw powoduje konflikt nazw. to nie jest sposób C++.
Dlatego używam <cstdio>
nagłówków i radzę ci to zrobić.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-16 10:38:46
Z mojej własnej praktyki: używaj prefiksów std::
. Inaczej jeden dzień abs
ugryzie cię bardzo boleśnie, jeśli użyjesz zmiennoprzecinkowych punktów.
Niekwalifikowana abs
odnosi się do funkcji zdefiniowanej na int
na niektórych platformach. Na innych jest przeciążony. Jednak {[4] } jest zawsze przeciążony dla wszystkich typów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-17 14:16:22
Używanie tylko printf
Bez std::
może generować konflikty nazw i jest uważane za złą praktykę przez wielu programistów c++. Google jest twoim przyjacielem na tym, ale oto kilka linków, mam nadzieję, że to pomoże
Dlaczego "używanie przestrzeni nazw std" jest uważane za złą praktykę? http://www.cplusplus.com/forum/beginner/61121/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:31
In stdio
Jest to wersja C++ standardowego nagłówka biblioteki C @C stdio.h, i jego zawartość jest (w większości) taka sama jak nagłówek, ale wszystkie zawarte w przestrzeni nazw @C std (z wyjątkiem nazw, które są zdefiniowane jako makra w C).
Więc to nie powinno robić żadnej różnicy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-16 10:40:56