Ответ 1
Программа является действительной программой C.
main
не является зарезервированным идентификатором, и ему разрешено указывать переменные как main
в C.
То, что вы не можете сделать, это указать переменную main
в области файлов, но это то же самое, что и с другими переменными, которые конфликтуют с функцией с тем же именем:
Это неверно:
int main = 0;
int main(void)
{
}
По тем же причинам это неверно:
int foo = 0;
int foo(void)
{
return 0;
}
EDIT:, чтобы обратиться к редактированию вопроса OP, вторая программа в вопросе OP также действительна, так как C говорит
(C11, 7.1.3p1) "Все идентификаторы с внешней связью в любом из следующих подклассов (включая будущие направления библиотек) и errno всегда зарезервированы для использования в качестве идентификаторов с внешняя связь".
но идентификатор переменной fopen
имеет область действия блока и никакой связи в примере программы.