C статический инициализатор элемента не является постоянной ошибкой - PullRequest
0 голосов
/ 11 мая 2018

это мой исходный код на языке Си Я хочу определить основные данные, используя статические, вне функции

#include <stdio.h>

typedef struct {
    char * URI;
    char * file;
} redirect_t;

typedef struct {
    char * URI;
    char * file;
    long long content_length;
} content_t;

typedef struct {
    content_t contents[10];
    redirect_t redirects[10];
} host_t;

typedef struct {
    unsigned max_requests;
    host_t hosts[10];
} addr_t;

static addr_t addr_list[] = {
        (addr_t) { 24,
            {
                (host_t) {
                    {
                        (content_t) { "URI" },
                        (content_t) { "URI2" },
                        (content_t) { "URI3" },
                    },
                    {
                        (redirect_t) { "URI5" },
                        (redirect_t) { "URI6" },
                        (redirect_t) { "URI7" },
                    }
                }
            }
        }
};

int main() {


    return 0;
}

но я получил (элемент инициализатора не постоянен) ошибка

и это мой результат компиляции

C:\Users\x\Documents\C Projects\untitled\main.c:27:26: error: initializer element is not constant
                 (host_t) {
                          ^
C:\Users\x\Documents\C Projects\untitled\main.c:27:26: note: (near initialization for '(anonymous).hosts')
C:\Users\x\Documents\C Projects\untitled\main.c:25:18: error: initializer element is not constant
         (addr_t) { 24,
                  ^
C:\Users\x\Documents\C Projects\untitled\main.c:25:18: note: (near initialization for 'addr_list')
C:\Users\x\Documents\C Projects\untitled\main.c:25:9: error: initializer element is not constant

Я знаю, что могу использовать malloc внутри функции и вставлять данные в (addr_list), но я хочу вставить их напрямую без какого-либо динамического выделения. в чем проблема? почему я получаю такую ​​ошибку!

1 Ответ

0 голосов
/ 11 мая 2018

Да, использование составных литералов таким способом является нестандартным, они не считаются "константами", а объектами.Правильный инструмент обозначен инициализаторами.Например, для вашего типа host_t инициализатор будет выглядеть как

                {
                    .contents  = { .URI = "URI",  },
                    .redirects = { .URI = "URI5", },
                },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...