Можем ли мы использовать main, printf, scanf для именования идентификаторов? - PullRequest
4 голосов
/ 01 октября 2010
int main()
{
  int main=5;
  printf("%d",main);
  return 0;
}

В этом случае ошибки нет, и компилятор gcc выводит 5. Но если я напишу

 int main()
    {
        int printf=5;
        printf("%d",printf);
        return 0;
    }

, компилятор выдаст ошибку ... почему?

Ответы [ 4 ]

9 голосов
/ 01 октября 2010

В первом примере вы «скрываете» функцию main, заменяя ее объектом int.

Во втором примере вы «скрываете» функцию printf, заменяя ее наint объект.Попытка вызвать int незаконна.

5("foo"); /* illegal to call "function" 5 */
2 голосов
/ 01 октября 2010

В своем первом фрагменте кода вы объявляете локальную переменную main , которая находится в области действия local , поэтому она не влияет на область действия global (где объявлена ​​функция main () )

Во втором фрагменте кода вы объявляете "printf" в глобальной области видимости, где живет функция printf () значит у вас конфликт.

2 голосов
/ 01 октября 2010

Во втором примере вы объявили локальную переменную типа int с именем printf.Это будет иметь приоритет над глобальной функцией с тем же именем.Так что ошибка в том, что имя printf относится к int, а не к функции.

В первом примере вы переопределяете глобальное имя функции main с локальной переменной main.Если бы вы этого не сделали, вы бы смогли вызвать функцию «main» из функции main, и это сработало бы.С вашим объявлением переменной это больше невозможно, так как объявление локальной переменной имеет приоритет - но оно все равно идеально подходит для использования в форме переменной.

1 голос
/ 01 октября 2010

Вы не должны использовать имена функций в качестве имен переменных, по любой причине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...