Вы можете использовать имена scanf
и printf
в области действия блока или в пространстве имен тегов структур, объединений или перечислений, или в пространстве имен членов структур и объединений, или в области действия прототипа функции.
Имя типа scanf
или printf
, объявленное в области блока, скроет соответствующее имя функции, объявленное в области файла. Но вы не можете повторно объявлять эти имена в области файлов.
Вот демонстрационная программа.
#include <stdio.h>
int main(void)
{
int printf = 10;
{
int *scanf = &printf;
extern int printf(const char * restrict format, ...);
printf( "printf = %d\n", *scanf );
}
return 0;
}
Его вывод
printf = 10
А вот еще одна демонстрационная программа, которая показывает другие способы использования имени printf
#include <stdio.h>
struct printf
{
int printf;
};
void f( int printf );
void f( int x )
{
printf( "x = %d\n", x );
}
int main(void)
{
struct printf printf = { .printf = 10 };
f( printf.printf );
return 0;
}
Вывод программы
x = 10
Естественно, такое использование имени printf только запутает читателей кода.
Что касается имен, начинающихся с подчеркивания, то в соответствии со стандартом C (7.1.3 Зарезервированные идентификаторы)
1 Каждый заголовок объявляет или определяет все идентификаторы, перечисленные в связанном с ним подпункте, и необязательно объявляет или определяет идентификаторы, перечисленные в соответствующем подпункте направлений будущей библиотеки, и идентификаторы, которые всегда зарезервированы либо для любого использования, либо для использования в качестве идентификаторов области файла.
— Все идентификаторы, начинающиеся с символа подчеркивания и либо с прописной буквы, либо с другого знака подчеркивания, всегда зарезервированы для любого использования.
Таким образом, вы не можете использовать идентификатор, как в этом объявлении, ни в области файла, ни в области блока.
int __;
Имя зарезервировано реализацией.
Что касается этого объявления в вашем фрагменте кода
int _;
тогда, поскольку он не имеет файловой области (у него есть блочная область), тогда используемый в объявлении идентификатор (объявление, использующее этот идентификатор) является допустимым.
Но если вы объявите имя в области файлов, например
int _;
int main( vpid )
{
//...
}
то такое объявление идентификатора будет недействительным.
Также вы не можете использовать такой идентификатор в качестве имени тега в области видимости файла. Например
struct _
{
int x;
};
int main( void )
{
//...
}
— Все идентификаторы, начинающиеся со знака подчеркивания, всегда зарезервированы для использования в качестве идентификаторов с файловой областью как в обычном пространстве имен, так и в пространстве имен тегов.
person
Vlad from Moscow
schedule
24.03.2021