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?

Author: DeiDei, 2015-09-16

8 answers

Ze standardu C++11 (podkreślenie):

D. 5 C nagłówki biblioteki standardowej [depr.C. nagłówki]

  1. dla kompatybilności z biblioteką standardową C...
  2. 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).
  3. przykład: nagłówek <cstdlib> z pewnością dostarcza swoje deklaracje i definicje w przestrzeni nazw std. 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 nazw std.

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");
}
 98
Author: sergej,
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.

 76
Author: T.C.,
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.

 7
Author: jalf,
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.

 3
Author: syntagma,
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ć.

 3
Author: NeonMercury,
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.

 3
Author: eiennohito,
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/

 2
Author: razvan,
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.

 2
Author: anukul,
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