C в некоторой степени, не совсем так, является подмножеством C ++. Таким образом, мы можем использовать большинство функций / заголовков C в C ++, немного изменив имя ( stdio.h
на cstdio
, stdlib.h
на cstdlib
).
На самом деле мой вопрос носит семантический характер. В коде C ++ ( с использованием новейшей версии GCC компилятора), я могу позвонить printf("Hello world!");
и std::printf("Hello world!");
и она работает точно так же. И в ссылке, которую я использую, он также отображается как std::printf("Hello world!");
.
Мой вопрос в том, что лучше использовать std::printf();
в C ++? Есть разница?
c++
language-lawyer
std
DeiDei
источник
источник
C
символов библиотеки в глобальное пространство имен был незаконным, я предпочитаю использоватьstd::
подходящие версии. (Плюс мне бы хотелось, чтобы они сделали это незаконным).Ответы:
Из стандарта С ++ 11 (выделено мной):
Использование заголовков «name.h» не рекомендуется, они были определены как кандидаты на удаление из будущих версий.
Итак, я бы предложил включить заголовки «cname» и использовать объявления и определения из
std
пространства имен.Если вам по каким-то причинам необходимо использовать заголовки «name.h» (они устарели, см. Выше), я бы предложил использовать объявления и определения из глобального пространства имен.
Другими словами: предпочитаю
над
источник
<cmeow>
всегда предоставляет::std::purr
и может или не может предоставить::purr
.<meow.h>
всегда предоставляет::purr
и может или не может предоставить::std::purr
.Используйте форму, которая гарантированно будет предоставлена включенным вами заголовком.
источник
<cmeow>
не<meow.h>
выдает ни,::std::purr
ни::purr
скорее ошибку препроцессора. Только<cstdio>
и / или<stdio.h>
предоставляет::std::printf
и / или::printf
. : Pstrcat
произвести::purr
.Нет, ты в любом случае в порядке.
Оригинальное намерение состояло в том, что
<___.h>
заголовки были бы C версию , которые ставят все в глобальном пространстве имен, и<c___>
заголовки будут быть C ++ - маньяки версия, что место все вstd
пространстве имен.Однако на практике версии C ++ также помещают все в глобальное пространство имен. И нет четкого консенсуса в отношении того, что использование
std::
версий «правильно».В общем, используйте то, что вам больше нравится. Наиболее распространенным, вероятно, является использование функций стандартной библиотеки C в глобальном пространстве имен (
printf
вместоstd::printf
), но нет особых причин считать одну «лучше» другой.источник
Единственное отличие состоит в том, что
std::printf()
, добавивstd::
разрешение области видимости, вы обезопасите себя от того, что кто-то напишет функцию с тем же именем в будущем, что приведет к конфликту пространства имен. Оба использования приведут к точно таким же вызовам API ОС (вы можете проверить это в Linux, запустивstrace your_program
).Я считаю очень маловероятным, что кто-то назовет такую функцию таким, поскольку
printf()
это одна из наиболее часто используемых функций. Кроме того, в C ++iostream
s предпочтительнее вызововcstdio
таких функций, как printf.источник
printf
в C ++ он сильно сломан из-за отсутствия строгой типизации, замена его на лучшую версию вполне естественна.std::printf
is different frommynamespace::printf
, и C ++ явно позволяет мне определять мои собственные функции, чьи имена дублируют имена функций внутриstd
. Это просто не подлежит обсуждению. Что касается ваших утверждений, которыеprintf
эффективны из-за неправильного набора текста, это, конечно, тоже неверно.printf
даже не особенно эффективен, есть много более эффективных строго типизированных реализаций.Из стандарта C ++ 11:
Итак, если вы используете
<cstdio>
, вы можете быть уверены, чтоprintf
он будетnamespace std
в глобальном пространстве имен, а, следовательно, и не в нем.Использование глобального пространства имен создает конфликт имен. Это не способ C ++.
Поэтому я использую
<cstdio>
заголовки и советую вам это сделать.источник
<cstdio>
вы гарантируете, что std :: printf будет существовать, но нет никакой гарантии от стандарта if :: printf будет или не будет существовать. В самом деле, в каждом компиляторе я когда - либо слышал :: Printf будет введен в глобальное пространство имен при включении<cstdio>
.Из собственной практики: используйте
std::
префиксы. В противном случае один деньabs
будет укусить вас очень больно в случае , если вы используете плавающие точки.Неквалифицированный
abs
относится к функции, определеннойint
на некоторых платформах. На других перегружено. Однакоstd::abs
всегда перегружен для всех типов.источник
Использование только
printf
без негоstd::
может привести к конфликтам имен и считается плохой практикой многими разработчиками C ++. Google - ваш друг, но вот несколько ссылок, надеюсь, это поможетПочему "использование пространства имен std" считается плохой практикой? http://www.cplusplus.com/forum/beginner/61121/
источник
using namespace std
- плохая практика, но использованиеprintf
безstd::
квалификатора - нет.using namespace std;
это не моя проблема. Никогда не использую.printf();
иstd::printf();
работать на C ++ безusing namespace std;
этого, поэтому я разместил вопрос.std::printf
его использовать, это просто странно.В stdio
Так что это не должно иметь никакого значения.
источник