указатель на анонимный массив массивов в c - PullRequest
0 голосов
/ 24 августа 2018

Итак, у меня есть массив, объявленный так (это не мой код, и я не буду его изменять ):

static const struct {
    int gsmesc;
    int latin1;
    int utf8_int;
    char *utf8;
    ...

} gsm_escapes[] = {
    {  10, 12 , 0x0C, "\x0C" },
    {  20, '^', 0x5E, "\x5E" }, 
    ...
};

Обратите внимание, что сама структура без тегов .

Я хочу перебрать этот массив с указателем (а не с индексом массива), и лучшее, что я могу придумать, это то, что компилируется без каких-либо предупреждений:

typeof(*gsm_escapes) *esc;
...

esc = gsm_escapes;
while (esc++->gsmesc != -1) {

    esc = gsm_escapes;
    while (esc->gsmesc != -1) {

Есть ли "правильный" способ объявить этот тип указателя, поскольку этот подход кажется нехарактерно неэлегичным?

Как вообще называется этот тип структуры данных? Я уже давно гуглюсь и не нашел ни одного учебника для начинающих.

1 Ответ

0 голосов
/ 24 августа 2018

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

Вы можете выбрать:

  • Оставить все как есть
  • Использовать нотацию массивавместо обозначения указателя:

    int i=0;
    while (gsm_escapes[i++]->gsmesc != -1) {
    
        i=0;
        while (gsm_escapes[i]->gsmesc != -1) {
    
  • Создайте typedef для структуры, используя typeof.Таким образом, выражение typeof появляется только один раз:

    typedef typeof(*gsm_escapes) struct_gsm_escapes;
    ...
    struct_gsm_escapes *esc;
    
...