Por que “std :: printf” e “printf” são compilados quando se usa <cstdio> em vez de <stdio.h> em C ++? [duplicado

Esta pergunta já tem uma resposta aqui:

Ao usar cabeçalhos C em C ++, devemos usar funções de std :: ou o namespace globa 8 respostas

Para meu conhecimento, cabeçalhos do formuláriocxyz são idênticos axyz.h com a única diferença de quecxyz coloca todo o conteúdo dexyz.h sob o namespacestd. Por que os programas a seguir são compilados no GCC 4.9 e no clang 6.0?

#include <cstdio>

int main() {
    printf("Testing...");
    return 0;
}

e o segundo programa:

#include <cstdio>

int main() {
    std::printf("Testing...");
    return 0;
}

O mesmo vale para a estrutura FILE:

FILE* test = fopen("test.txt", "w");

std::FILE* test = std::fopen("test.txt", "w");

ambos os trabalho

Até agora, eu sempre pensei que era melhor usarcstdio, cstring, etc, em vez de suas contrapartes sem espaço para nome. No entanto, qual dos dois programas a seguir acima é uma prática recomendada?

mesmo vale para outras funções C, como memset (do cstring), scanf (também do cstdio) et

(Eu sei que algumas pessoas perguntam por que estou usando C IO em um programa C ++; o problema aqui não é especificamente C IO, mas se esse código deve ou não ser compilado sem especificar especificamentestd:: antes de chamar uma função C com espaço para nome

questionAnswers(1)

yourAnswerToTheQuestion