Warum werden sowohl "std :: printf" als auch "printf" kompiliert, wenn <cstdio> anstelle von <stdio.h> in C ++ verwendet wird? [Duplikat

Diese Frage hat hier bereits eine Antwort:

Wenn wir C-Header in C ++ verwenden, sollten wir Funktionen aus std :: oder dem globalen Namespace verwenden? 8 answers

Meines Wissens nach Kopfzeilen des Formularscxyz sind identisch mitxyz.h mit dem einzigen Unterschied, dasscxyz platziert den gesamten Inhalt vonxyz.h unter dem Namespacestd. Warum kompilieren die folgenden Programme sowohl auf GCC 4.9 als auch auf Clang 6.0?

#include <cstdio>

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

und das zweite Programm:

#include <cstdio>

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

Das gleiche gilt für die FILE-Struktur:

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

un

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

beide arbeiten

Up bis jetzt dachte ich immer, dass es besser ist, @ zu verwendcstdio, cstring, etc, anstatt ihre nicht namengebundenen Gegenstücke. Welche der beiden folgenden Programme sind jedoch besser geeignet?

Das gleiche gilt für andere C-Funktionen wie memset (von cstring), scanf (auch von cstdio) usw.

(Ich weiß, dass einige Leute fragen werden, warum ich C IO in einem C ++ - Programm verwende. Das Problem hier ist nicht spezifisch C IO, aber ob dieser Code kompiliert werden sollte oder nicht, ohne spezifisch @ anzugebestd:: vor dem Aufruf einer C-Funktion mit Namensraum.)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage