Интересный синтаксис / тип структуры C - PullRequest
2 голосов
/ 28 мая 2011

Я сталкивался с этим в исходном коде интерпретатора Python.

void
PyThread_delete_key_value(int key)
{
    long id = PyThread_get_thread_ident();
    struct key *p, **q;

Интересная часть - вызов struct key *p, **q;.Что именно делает эта структура?Я смущен относительно того, что именно это структура.Разве это не то же самое, что, скажем, это?

struct 1 *p;

Я в замешательстве.

Редактировать :

Даже если на этот вопрос был дан ответ,Я должен прояснить свой вопрос.Именно тот факт, что слово key использовалось повторно, и я не знал, что компилятор рассматривает их в разных пространствах имен.

Ответы [ 4 ]

5 голосов
/ 28 мая 2011

p - указатель на объект типа struct key.q - это указатель на указатель на объект типа struct key.

. Вы можете определить структуру следующим образом:

struct key { int val; };

В этом случае тип равен struct key.

key после struct является частью типа (struct key) и не связано с целочисленным параметром key.

5 голосов
/ 28 мая 2011
Ключ

существует в двух разных пространствах имен. Один раз как переменная, один раз как структура. Компилятор знает, что struct key и int key - это разные вещи.

0 голосов
/ 28 мая 2011

Это указатели на структуру. p - это указатель на структуру ключа, а q - указатель на указатель структуры ключа. Трудно сказать, что здесь происходит, не видя struct typedef или как используются указатели.

0 голосов
/ 28 мая 2011

Во-первых, параметр int key не имеет ничего общего с struct key в объявлении. Это просто неудачное именование.

Структуры находятся в другом пространстве имен, поэтому он работает.

Линия

struct key *p, **q;

Объявляет две переменные.

Первый называется p и имеет тип struct key *. Второй называется q и имеет тип struct key **.

Звездочка, обозначающая тип указателя, привязывается к имени переменной , а не к общему типу в объявлении.

Кроме того, как я прокомментировал в ответе Мипади , у меня был профессор, который предположительно спросил Кернигана (или, может быть, это был Ричи), почему в выражениях C их декларации отражались в синтаксисе. Он сказал, что это будет возможность повторно использовать тот же код синтаксического анализа. По-видимому, компилятор C был довольно близок к тому, чтобы быть слишком большим для того, чтобы соответствовать системе, для которой он был написан.

Иногда это приятно, так как вы можете быть уверены, что если у вас есть объявление

int **foo[];

Тогда выражение

**foo[3]

будет иметь тип int, без особого обдумывания.

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