C es algo, no exactamente, un subconjunto de C ++. Entonces podemos usar la mayoría de las funciones / encabezados de C en C ++ cambiando el nombre un poco ( stdio.h
a cstdio
,stdlib.h
a cstdlib
).
Mi pregunta es en realidad un poco semántica. En el código C ++ (usando la versión más reciente del compilador GCC), puedo llamar printf("Hello world!");
y std::printf("Hello world!");
funciona exactamente igual. Y en la referencia que estoy usando también aparece como std::printf("Hello world!");
.
Mi pregunta es, ¿se prefiere usar std::printf();
en C ++? ¿Hay una diferencia?
c++
language-lawyer
std
DeiDei
fuente
fuente
C
símbolos de la biblioteca en el espacio de nombres global sea ilegal, prefiero usar lasstd::
versiones calificadas. (Además, desearía que lo hubieran hecho ilegal).Respuestas:
Del estándar C ++ 11 (el énfasis es mío):
El uso de los encabezados «name.h» está en desuso, se han identificado como candidatos para ser eliminados de futuras revisiones.
Entonces, sugeriría incluir los encabezados «cname» y usar las declaraciones y definiciones del
std
espacio de nombres.Si tiene que usar los encabezados «name.h» por alguna razón (está desaprobado, vea arriba), sugeriría usar las declaraciones y definiciones del espacio de nombres global.
En otras palabras: prefiero
encima
fuente
<cmeow>
siempre proporciona::std::purr
y puede o no proporcionar::purr
.<meow.h>
siempre proporciona::purr
y puede o no proporcionar::std::purr
.Utilice el formulario que garantiza el encabezado que incluye.
fuente
<cmeow>
ni<meow.h>
proporciona ni::std::purr
ni,::purr
sino un error de preprocesador. Solo<cstdio>
y / o<stdio.h>
proporciona::std::printf
y / o::printf
. : Pstrcat
producir::purr
.No, estás bien de cualquier manera.
La intención original era que los
<___.h>
encabezados fueran las versiones de C que pusieran todo en el espacio de nombres global, y los<c___>
encabezados serían las versiones de C ++, que colocan todo en elstd
espacio de nombres.En la práctica, sin embargo, las versiones de C ++ también colocan todo en el espacio de nombres global. Y no hay un consenso claro de que usar el
std::
versiones sea "lo correcto".Entonces, básicamente, use el que prefiera. Lo más común es probablemente usar las funciones de la biblioteca estándar de C en el espacio de nombres global (en
printf
lugar destd::printf
), pero no hay muchas razones para considerar una "mejor" que la otra.fuente
La única diferencia que hay es que
std::printf()
al agregarstd::
resolución de alcance, se protegerá de que alguien escriba una función con el mismo nombre en el futuro, lo que conduciría a un conflicto de espacio de nombres. Ambos usos conducirán a exactamente las mismas llamadas a la API del sistema operativo (puede verificarlo en Linux ejecutándolostrace your_program
).Me parece muy poco probable que alguien nombre una función así, ya que
printf()
es una de las funciones más utilizadas. Además, en C ++,iostream
se prefieren las llamadas acstdio
funciones como printf.fuente
printf
está muy roto en C ++ debido a su falta de escritura fuerte, reemplazarlo con una mejor versión es bastante natural.std::printf
es diferente demynamespace::printf
, y C ++ explícitamente me permite definir mis propias funciones cuyos nombres sombrean los de las funciones internasstd
. Eso simplemente no es discutible. En cuanto a sus afirmaciones de queprintf
es eficiente debido a la escritura imprecisa, por supuesto también es incorrecto.printf
ni siquiera es particularmente eficiente, hay muchas implementaciones más eficientes que están fuertemente tipadas.Desde el estándar C ++ 11:
Entonces, si lo usa
<cstdio>
, puede estar seguro de queprintf
estará en elnamespace std
espacio de nombres global y, por lo tanto, no.El uso de un espacio de nombres global crea un conflicto de nombres. Esta no es la forma de C ++.
Por lo tanto, estoy usando
<cstdio>
encabezados y le aconsejo que lo haga.fuente
<cstdio>
, tiene la garantía de que std :: printf existirá, pero no hay garantía del estándar si :: printf también existirá o no. De hecho, en cada compilador del que he oído hablar, :: printf se inyecta en el espacio de nombres global cuando se incluye<cstdio>
.De mi propia práctica: use
std::
prefijos. De lo contrario, un díaabs
te morderá mucho en caso de que uses puntos flotantes.No calificado se
abs
refiere a la función definidaint
en algunas plataformas. En otros está sobrecargado. Sin embargo,std::abs
siempre está sobrecargado para todos los tipos.fuente
Usar solo
printf
sinstd::
podría generar algunos conflictos de nombres y muchos desarrolladores de C ++ lo consideran una mala práctica. Google es tu amigo en este caso, pero aquí hay algunos enlaces, espero que esto ayude¿Por qué se considera una mala práctica "utilizar el espacio de nombres estándar"? http://www.cplusplus.com/forum/beginner/61121/
fuente
using namespace std
es una mala práctica, pero usarprintf
sinstd::
calificador no lo es.using namespace std;
no es mi problema aqui. Yo nunca lo uso.printf();
ystd::printf();
trabajar en C ++ sin.using namespace std;
Por eso publiqué la pregunta.std::printf
se siente simplemente extraño.En stdio
Entonces no debería hacer ninguna diferencia.
fuente