Почему `typedef` может различать guish синтаксис определения? - PullRequest
0 голосов
/ 17 января 2020

Случай использования typedef:

struct tagPOINT
{  
    int x;  
    int y;  
};  

typedef struct tagPOINT MyPoint;

MyPoint point = {1, 2};

Вы видите этот код строки: typedef struct tagPOINT MyPoint;

почему typedef может различать guish код затем разделите на struct tagPOINT и MyPoint вместо struct и tagPOINT MyPoint?

Ответы [ 2 ]

3 голосов
/ 17 января 2020

В грамматике C единственным токеном, который может следовать после ключевого слова struct, является либо идентификатор , либо {. Если это идентификатор, это структурный тег (который является именем для структуры). Таким образом, всякий раз, когда компилятор видит struct tagPOINT, он знает, что tagPOINT является структурным тегом, даже если он имеет другое значение, когда он не сразу после struct.

0 голосов
/ 17 января 2020

Ключевое слово typedef служит в качестве спецификатора класса хранения в синтаксисе:

typedef struct tagPOINT MyPoint;

Другими словами, синтаксически оно занимает то же место в структуре фразы, что и extern или static:

extern struct tagPOINT MyPoint;

Здесь у нас есть базовая фраза c по моей памяти, а не по документу ISO:

<storage-class-specifier> <specifier-qualifier-list> <declarator> ;

typedef - это список спецификаторов класса хранения, struct tagPOINT - это спецификатор типа, содержащий список спецификаторов-спецификаторов, а MyPoint - это декларатор.

Ваш синтаксический анализатор C сортирует все это в соответствии с грамматикой.

In Другими словами, это не просто тот случай, когда typedef - это какая-то команда на командном языке, для которой нужно анализировать аргументы некоторым ad ho c способом.

...