Jak zadeklarować statyczne globalne rekurencyjnie zależne tablice?

0

Dostałem dzisiaj taki kawałek kodu, który kiedyś (lata temu) się kompilował, a teraz niestety nie:

struct state_str
{
    char *buf1;
    char *buf2;
    void (*routine)(char *);
    struct state_str *next_state;
};
typedef struct state_str STATE;

extern STATE init_state[];
extern STATE load_name[];

static STATE straight_comment[] = {
    {"\x01",          "\x7f",          NULL,                 straight_comment},
    {"\x0a",          "\x0a",          NULL,                 straight_comment},
    {END_STATE, "Invalid character in comment line", NULL, init_state}
};

static STATE init_state[] = {
    {"#",             "#",             NULL,                 straight_comment},
    {"(NAME,",        "(NAME,",        check_for_end,        load_name},
    {" ",             "~",             NULL,                 init_state},
    {"\x0a",          "\x0a",          NULL,                 init_state},
    {END_STATE, "Unknown start to line", NULL, init_state}
};

Komunikat błędu był mniej więcej taki:

error: static declaration of ‘init_state’ follows non-static declaration
error: previous declaration of ‘init_state’ was here

Rozwiązałem problem kompilacji poprzez wywalenie static z definicji tych tablic, ale tak z czystej ciekawości zacząłem się zastanawiać czy da się inaczej, tak żeby zostawić te static?

1

Zamiast extern (bez -Wall i -pedantic) może zadziałać (jako UB ;p ):

static STATE init_state[];

Rozwiązanie zagadki znajdziesz tutaj: https://groups.google.com/forum/#!topic/comp.lang.c.moderated/bmiF2xMz51U

0

Po prostu, extern init_state[] informuje, że ta tablica została zadeklarowana gdzieś w innym pliku, a static, że jest ona lokalna dla pliku, więc te dwie rzeczy się wzajemnie wykluczają. Nawet jeżeli są jakieś sztuczki z kompilatorem pozwalajace to obejść, to mija się to z celem, gdyż powstałby dosyć nieczytelny kod.

0

Wywal static tutaj: static STATE straight_comment[].

Poza tym masz więcej błędów. Na przykladzie dlaczego to wyzej sie nie skompiluje:

int a[] = {1,2,3};
int b[] = {a, 3}; // to sie zupelnym przypadkiem skompiluje, ale nie bedzie dzialac tak jak chcesz - sprawdz
0
krwq napisał(a):

Wywal static tutaj: static STATE straight_comment[].
Tak też zrobiłem jak napisałem w pierwszym poście. Tyle że byłem ciekaw czy można mieć te tablice jako statyczne i jeśli nie to dlaczego.

Poza tym masz więcej błędów. Na przykladzie dlaczego to wyzej sie nie skompiluje:

int[] a = {1,2,3};
int[] b = {a, 3}; // to sie zupelnym przypadkiem skompiluje, ale nie bedzie dzialac tak jak chcesz - sprawdz

To też się nie skompiluje :P Ale pomijając pomyłkę syntaktyczną to:

  1. Oczekuję, że b ma 2 wartości: wartość wskaźnika i numer 3. Kompilator zdaje się potwierdzić.
  2. W tamtym przykładzie oczekiwano wskaźnika i podano adres tablicy, a w Twoim przykładzie oczekujesz int i dajesz mu wskaźnik, więc nie widzę bezpośredniego powiązania. Chyba że coś przeoczyłem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1