que - Al usar encabezados C en C++, ¿debemos usar funciones de std:: o el espacio de nombres global?
para que sirve el using namespace std en dev c++ (8)
Del estándar C ++ 11 (énfasis mío):
D.5 C cabeceras de biblioteca estándar [depr.c.headers]
- Para compatibilidad con la biblioteca estándar C ...
- Cada encabezado C, cada uno de los cuales tiene un nombre con el nombre del formulario. H , se comporta como si cada nombre colocado en el espacio de nombres de la biblioteca estándar por el encabezado cname correspondiente se ubicara dentro del alcance del espacio de nombres global . No se especifica si estos nombres se declaran o definen primero dentro del alcance del espacio de nombres (3.3.6) del espacio de nombres estándar y luego se inyectan en el alcance del espacio de nombres global mediante declaraciones explícitas de uso (7.3.3).
- Ejemplo: el encabezado
<cstdlib>
seguramente proporciona sus declaraciones y definiciones dentro del espacio de nombresstd
. También puede proporcionar estos nombres dentro del espacio de nombres global. El encabezado<stdlib.h>
seguramente proporciona las mismas declaraciones y definiciones dentro del espacio de nombres global , al igual que en el Estándar C. También puede proporcionar estos nombres dentro del espacio de nombresstd
.
El uso de los encabezados «name.h» está en desuso, se han identificado como candidatos para su eliminación de futuras revisiones.
Por lo tanto, sugeriría incluir los encabezados «cname» y utilizar las declaraciones y definiciones del
std
nombres
std
.
Si tiene que usar los encabezados «name.h» por alguna razón (está en desuso, vea más arriba), sugeriría usar las declaraciones y definiciones del espacio de nombres global.
En otras palabras: prefiera
#include <cstdio>
int main() {
std::printf("Hello world/n");
}
terminado
#include <stdio.h>
int main() {
printf("Hello world/n");
}
C es algo, no exactamente, un subconjunto de C ++.
Por lo tanto, podemos usar la mayoría de las funciones / encabezados de C en C ++ cambiando un poco el nombre (
stdio.h
a
cstdio
,
stdlib.h
a
cstdlib
).
Mi pregunta es realmente semántica.
En el código C ++ (usando la versión más reciente del compilador GCC), puedo llamar a
printf("Hello world!");
y
std::printf("Hello world!");
y 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?
Del estándar C ++ 11:
Cada encabezado C, cada uno de los cuales tiene un nombre con el nombre del formulario. H, se comporta como si cada nombre colocado en el espacio de nombres de la biblioteca estándar por el encabezado cname correspondiente se ubicara dentro del alcance del espacio de nombres global. No se especifica si estos nombres se declaran o definen primero dentro del alcance del espacio de nombres (3.3.6) del espacio de nombres estándar y luego se inyectan en el alcance del espacio de nombres global mediante declaraciones explícitas de uso (7.3.3).
Entonces, si usa
<cstdio>
, puede estar seguro de que
printf
estará en el
namespace std
y, por lo tanto, no en el espacio de nombres global.
El uso de un espacio de nombres global crea un conflicto de nombres.
Esta no es la forma C ++.
Por lo tanto, estoy usando encabezados
<cstdio>
y le aconsejo que lo haga.
Desde mi propia práctica: use
std::
prefixes.
De lo contrario, un día los
abs
te
morderán muy dolorosamente en caso de que uses puntos flotantes.
Los
abs
no calificados se refieren a la función definida en
int
en algunas plataformas.
En otros está sobrecargado.
Sin embargo,
std::abs
siempre está sobrecargado para todos los tipos.
En stdio
Esta es la versión C ++ del encabezado de la biblioteca estándar de C @c stdio.h, y su contenido es (en su mayoría) el mismo que ese encabezado, pero todos están contenidos en el espacio de nombres @c std (excepto los nombres que se definen como macros en DO).
Por lo tanto, no debería hacer ninguna diferencia.
La única diferencia es que en
std::printf()
al agregar la resolución
std::
scope se asegurará 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 exactamente a las mismas llamadas a la API del sistema operativo (puede verificarlo en Linux ejecutando
strace your_program
).
Me parece muy poco probable que alguien nombre una función como esa, ya que
printf()
es una de las funciones más comúnmente utilizadas.
Además, en C ++, los
iostream
s se prefieren a las llamadas a funciones
cstdio
como printf.
No, estás bien de cualquier manera.
La intención
original
era que los encabezados
<___.h>
serían las versiones C que pusieron todo en el espacio de nombres global, y los encabezados
<c___>
serían las versiones con C ++, que colocan todo en el
std
nombres
std
.
Sin embargo, en la práctica, las versiones de C ++
también
ponen todo en el espacio de nombres global.
Y no hay un consenso claro de que usar las versiones
std::
es "lo correcto".
Básicamente, usa el que prefieras.
Probablemente, lo más común es usar las funciones de la biblioteca estándar de C en el espacio de nombres global (
printf
lugar de
std::printf
), pero no hay muchas razones para considerar una "mejor" que la otra.
Usar solo
printf
sin
std::
podría generar algunos conflictos de nombres y es considerado una mala práctica por muchos desarrolladores de c ++.
Google es tu amigo en este caso, pero aquí hay algunos enlaces, espero que esto ayude
¿Por qué "usar el espacio de nombres estándar" se considera una mala práctica? http://www.cplusplus.com/forum/beginner/61121/
<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 se garantiza que será proporcionado por el encabezado que incluya.