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.ha 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

Csí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
stdespacio 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::purry puede o no proporcionar::purr.<meow.h>siempre proporciona::purry puede o no proporcionar::std::purr.Utilice el formulario que garantiza el encabezado que incluye.
fuente
<cmeow>ni<meow.h>proporciona ni::std::purrni,::purrsino un error de preprocesador. Solo<cstdio>y / o<stdio.h>proporciona::std::printfy / o::printf. : Pstrcatproducir::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 elstdespacio 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
printflugar 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 ++,iostreamse prefieren las llamadas acstdiofunciones como printf.fuente
printfestá muy roto en C ++ debido a su falta de escritura fuerte, reemplazarlo con una mejor versión es bastante natural.std::printfes 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 queprintfes eficiente debido a la escritura imprecisa, por supuesto también es incorrecto.printfni 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 queprintfestará en elnamespace stdespacio 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íaabste morderá mucho en caso de que uses puntos flotantes.No calificado se
absrefiere a la función definidainten algunas plataformas. En otros está sobrecargado. Sin embargo,std::abssiempre está sobrecargado para todos los tipos.fuente
Usar solo
printfsinstd::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 stdes una mala práctica, pero usarprintfsinstd::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::printfse siente simplemente extraño.En stdio
Entonces no debería hacer ninguna diferencia.
fuente