Программирование на C - тайный синтаксис структуры - почти похоже на словарь Python - Что это? - PullRequest
0 голосов
/ 03 июня 2018

Я довольно новичок в 'C' и столкнулся с выражением, которое меня совершенно сбило с толку.

static struct option gLongOption[] = {
{"port", arg, NULL, 'p'},
{"maxqueue", arg, NULL, 'q'},
{"help", non_arg, NULL, 'h'},
{NULL, 0, NULL, 0}}

Что это?Почему массив объявляется как структура?Почему структура массива присваивается (как выглядит) другим структурам?Это стандартная практика в C, у которой есть имя, и я могу прочитать о ней?Это «C» способ создания «словарных» структур?Две вещи, которые я знаю, это то, что выше относится к аргументам командной строки, найденным в argv, предназначенном в качестве входных данных для модели клиент \ сервер;в противном случае я полностью сбит с толку.Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Это не что иное, как словарь Python, использующий алгоритм хеширования для ключа, чтобы найти значение, это просто массив структур (не массив, объявленный как структура).

Похоже,оно взято из GNU getopt_long, вы должны прочитать документацию, чтобы понять поля.Это ни в коем случае не необычно.

static struct option gLongOption[] 

Чтобы прочитать эту декларацию, вы можете использовать правило: «смотри направо, продолжай смотреть, затем смотри налево».

Сначала найдите имя переменной gLongOption, затем посмотрите направо.Когда мы видим [], мы говорим «массив».Итак, gLongOption - это массив .....

Ничего другого справа, поэтому посмотрите налево, struct option, и это static.

Итак, gLongOption - это массив опций структуры, и он равен static.

Этот простой метод немного ломается, когда у нас есть встроенные скобки, поэтому мы должны использовать правилаприоритет, вы должны рассмотреть это позже.

{"port", arg, NULL, 'p'} и т. д. это просто способ инициализации структуры, элементы даны в порядке.

0 голосов
/ 03 июня 2018

gLongOption - это массив структур.C позволяет инициализировать массив следующим образом:

int array[] = {1, 2, 3}:

Далее, на последних диалектах C вы можете даже позже изменить содержимое массива на:

int array = {0};
...
array = (int[]) {1, 2, 3};

Аналогично, вы можетеинициализировать структуры следующим образом:

struct my_struct_t {
    int i;
    char c;
};

struct my_struct_t m = {1, 'a'};

gLongOption теперь является массивом структур, поэтому

static struct option gLongOption[] =
{ 
    {"port", arg, NULL, 'p'},   // initialize  gLongOption[0] as a struct of type struct option 
    {"maxqueue", arg, NULL, 'q'},  // initialize gLongOption[1]
    {"help", non_arg, NULL, 'h'},  // etc.
    {NULL, 0, NULL, 0}
};

инициализирует массив, элементы которого оказываются структурами, таким образом, элементы инициализируютсякак структуры.

Просто для полноты можно также использовать имена элементов структуры, чтобы присвоить всей структуре новое значение, например

m = (struct my_struct_t){
    .i = 2,  // note the dot. The comma could be ommitted
};

Все элементы, которыене инициализируются явно, затем инициализируются нулями, таким образом, m.c == '\0' после присвоения выше.

...