sirve que programacion para namespace dev c++ language-lawyer std

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]

  1. Para compatibilidad con la biblioteca estándar C ...
  2. 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).
  3. Ejemplo: el encabezado <cstdlib> seguramente proporciona sus declaraciones y definiciones dentro del espacio de nombres std . 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 nombres std .

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.



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