Грамматика и синтаксис typedef в языке Си - PullRequest
8 голосов
/ 06 апреля 2010

У меня проблема с ключевыми словами typedef на языке C.

В своей программе я использую следующие коды:

typedef int* a[10];

int main(){
 int a[10];
} 

они работают хорошо. Но почему нет конфликта между переменной и типом, имеющим одно и то же имя a?

С уважением.

Ответы [ 3 ]

6 голосов
/ 06 апреля 2010

См. msdn Справочник по языку C :

Имена Typedef делят пространство имен с обычными идентификаторами (см. Пространства имен для получения дополнительной информации). Следовательно, программа может иметь имя typedef и идентификатор локальной области с тем же именем.

6 голосов
/ 06 апреля 2010

Стандарт C гласит (Раздел 6.2.1 - Области применения идентификаторов):

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

K & R2 говорят (A.11.1 - Лексическая область)

Идентификаторы делятся на несколько имен пробелы, которые не мешают одному другой; один и тот же идентификатор может быть используется для различных целей, даже в та же область, если использование в разные пространства имен. Эти классы являются: объекты, функции, typedef имена и перечислимые константы; этикетки; метки структур или союзов, и перечисления; и члены каждого структура или объединение индивидуально.

Должен признать, это меня смущает. Читая вторую цитату, выясняется, что имена переменных и типы typedef должны конфликтовать.

3 голосов
/ 06 апреля 2010

Переменные и typedefs занимают то же пространство имен и и могут не обмениваться именами с другими идентификаторами в точно такой же области.

Однако ваш второй aвнутри main, и применяются правила области действия: второе a переопределяет первое.

Вы можете сделать то же самое с простыми переменными:

int a;

int main() {
    int a;
}

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

...