Итак, это код от студента моего друга ...Дублированный идентификатор переменной в функции локальной области
#include <stdio.h>
int main(){
int hours;
int take_one_number(void);{
scanf("%d",&hours);
}
int minutes;
int take_one_number(void);{
scanf("%d",&minutes);
}
int seconds;
int take_one_number(void);{
scanf("%d",&seconds);
}
int all;
printf("%d",all=hours*3600+minutes*60+seconds);
return all;
}
Ну, это ... компилирует ... и ... хмм, работает ... по просьбе учителя ...
Вопрос: Если я правильно понимаю, take_one_number
здесь есть определение переменной для хранения указателя функции. Почему ни GCC, ни LLVM не жалуются на дублированный идентификатор в этих определениях?
Если это должно быть объявление переменной для хранения указателя функции, не должно ли это быть int (* take_one_number) (void)? Я думаю, что это просто объявление прототипа функции внутри функции. – Jay
@ Jay: Да, я пропустил, что нужна звезда для переменной-указателя. – liori
@ lion: ваш комментарий: «Это не переменное определение, звезда отсутствует!» поскольку принятый ответ не является точным вообще, и не является вашим комментарием «звезда необходима для переменной-указателя к функции». Чтобы быть указателем на функцию, вам понадобится 'int (* take_one_number) (void);', для чего требуются две круглые скобки и звезда. Тогда у вас возникнут проблемы с попыткой определить одну и ту же переменную несколько раз, даже если переменная не используется. Скажем, код субоптимальный. Он должен проверить, что вызовы 'scanf()' преуспевают, например. Скобки остаются излишними после объявлений 'take_one_number()'. –