Your question is a bit confusing.
C has "scope rules" that determine how a name (for example printf) is resolved from a given point in the code. It is possible and legal in accordance with the rules of the scope to obscure the name from the outer scope.
printf extern -declared <stdio.h>, .
, . , . , , printf , C . ++ ::printf, printf. C .
, printf , :
{
int (*theprintf)(const char *fmt, ...) = printf;
int printf = 90;
theprintf("now printf has the value %d\n", printf);
}
, , extern, , :
{
extern int printf(const char * fmt, ...);
printf("hello?\n");
}