C декларации перед использованием - PullRequest
2 голосов
/ 26 января 2011

Все идентификаторы в C должны быть объявлены до их использования, но я не могу найти, где они обозначены в стандарте C99.

Я думаю, что это относится и к определениям макросов, но определен только порядок раскрытия макросов.

Ответы [ 2 ]

5 голосов
/ 26 января 2011

C99: TC3 6.5.1 §2, сноска 79 в явном виде гласит:

Таким образом, необъявленный идентификатор является нарушением синтаксиса.

в сочетании с п. 6.2.1 §5:

Если явно не указано иное, [...] оно [, т. Е. Идентификатор ] относится к сущность в соответствующем пространстве имен , объявление которой видно в точке идентификатора происходит .

и §7:

[...] Любой другой идентификатор имеет область видимости, которая начинается сразу после завершения его объявления.

2 голосов
/ 26 января 2011

Существует как минимум пара исключений из правила, что все идентификаторы должны быть удалены перед использованием:

  • в то время как C99 удалял неявные объявления функций, вы все еще можете видеть программы на C, которые полагаются, возможно, по незнанию, на них. На SO даже иногда возникает вопрос, например, что спрашивают, почему функции, которые возвращают double, не работают (когда заголовок, который включает в себя объявление функции, опущен). Кажется, что при компиляции с семантикой до C99 предупреждения для необъявленных функций часто не настраиваются для использования или игнорируются.

  • идентификатор для метки goto может использоваться до ее «объявления» - он неявно объявляется своим синтаксическим внешним видом (за которым следуют: и инструкция).

Исключение из правила для goto меток в значительной степени бесполезно, но факт, что идентификаторы функций могут использоваться без объявления (до C99), может быть полезно знать, потому что вы можете однажды в Некоторое время сталкиваюсь с проблемой, которая является основной причиной.

Кроме того, идентификаторы могут использоваться перед «объявлением» (строго говоря, перед определением) в предварительной обработке, где они могут быть проверены на то, определены они или нет, или использоваться в выражениях препроцессора, где они будут оцениваться до 0, если не определено иначе.

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