¿Por qué compilan "std :: printf" y "printf" cuando se usa <cstdio> en lugar de <stdio.h> en C ++? [duplicar
Esta pregunta ya tiene una respuesta aquí:
Al usar encabezados C en C ++, ¿deberíamos usar funciones de std :: o el espacio de nombres global? 8 respuestas Que yo sepa, encabezados de la formacxyz
son idénticos axyz.h
con la única diferencia de quecxyz
coloca todos los contenidos dexyz.h
debajo del espacio de nombresstd
. ¿Por qué los siguientes programas 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 ocurre con la estructura FILE:
FILE* test = fopen("test.txt", "w");
std::FILE* test = std::fopen("test.txt", "w");
ambos trabajan
Hasta ahora, siempre pensé que era mejor usarcstdio
, cstring
, etc., en lugar de sus contrapartes sin espacios de nombres. Sin embargo, ¿cuál de los siguientes dos programas anteriores es una mejor práctica?
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 C ++; el problema aquí no es específicamente C IO, sino si este código debe compilarse sin especificar específicamentestd::
antes de llamar a una función C de espacio de nombres.)