programacion - para que sirve el using namespace std en dev c++
¿Por qué se compilan tanto "std:: printf" como "printf" cuando se utiliza<cstdio> en lugar de<stdio.h> en C++? (1)
Esta pregunta ya tiene una respuesta aquí:
Que yo sepa, los encabezados de la forma cxyz
son idénticos a xyz.h
con la única diferencia de que cxyz
coloca todos los contenidos de xyz.h
bajo el espacio de nombres std
. ¿Por qué los siguientes programas se compilan en GCC 4.9 y clang 6.0?
#include <cstdio>
int main() {
printf("Testing...");
return 0;
}
y el segundo programa:
#include <cstdio>
int main() {
std::printf("Testing...");
return 0;
}
Lo mismo aplica para la estructura FILE:
FILE* test = fopen("test.txt", "w");
y
std::FILE* test = std::fopen("test.txt", "w");
ambos trabajan.
Hasta ahora, siempre pensé que era mejor usar cstdio
, cstring
, etc., en lugar de sus contrapartes sin espacios de nombres. Sin embargo, ¿cuál de los siguientes dos programas anteriores son mejores prácticas?
Lo mismo ocurre con otras funciones de C, como memset (de cstring), scanf (también de cstdio), etc.
(Sé que algunas personas preguntarán por qué estoy usando C IO en un programa en C ++, el problema aquí no es específicamente C IO, sino si este código debe o no compilar sin especificar específicamente std::
antes de llamar a una función C de espacio de nombres).
El estándar permite que el compilador también inyecte los nombres en el espacio de nombres global.
Una razón para esto es que permite que la implementación de <cstdio>
sea:
#include <stdio.h>
namespace std
{
using ::printf;
using ::fopen;
// etc.
}
por lo que el compilador / proveedor de la biblioteca no tiene que escribir y mantener tanto código.
En su propio código, siempre use std::
o using namespace std;
etc. para que su código sea portable a los compiladores que no inyecten los nombres en el espacio de nombres global.