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