Несовместимые типы указателей при инициализации массива - PullRequest
0 голосов
/ 11 мая 2019

Следующий инициализатор массива:

const char** AST_NODE_TYPE_NAMES = {
    "AST_NODE_CONSTANT",
    "AST_NODE_BINARY",
    "AST_NODE_UNARY",
    "AST_NODE_VARIABLE",
    "AST_NODE_ASSIGNMENT",
    "AST_NODE_STATEMENTS",
};

Делает gcc выдать следующее предупреждение:

initialization of 'const char **' from incompatible pointer type 'char *'

Помогите мне разобраться?

Ответы [ 2 ]

4 голосов
/ 11 мая 2019

вам нужен массив указателей

const char *AST_NODE_TYPE_NAMES[] = {
    "AST_NODE_CONSTANT",
    "AST_NODE_BINARY",
    "AST_NODE_UNARY",
    "AST_NODE_VARIABLE",
    "AST_NODE_ASSIGNMENT",
    "AST_NODE_STATEMENTS",
};

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

const char **foo1 = AST_NODE_TYPE_NAMES;
const char **foo = &AST_NODE_TYPE_NAMES[0];

вы также можете использовать составной литерал (который на самом деле являетсямассив указателей в данном случае) для инициализации этого указателя

const char** AST_NODE_TYPE_NAMES =(const char *[]) {
    "AST_NODE_CONSTANT",
    "AST_NODE_BINARY",
    "AST_NODE_UNARY",
    "AST_NODE_VARIABLE",
    "AST_NODE_ASSIGNMENT",
    "AST_NODE_STATEMENTS",
};
1 голос
/ 11 мая 2019

Указатель - это не агрегат , а скаляр, и он ожидает одно значение для его инициализации.В C также допустимо оборачивать скалярный инициализатор в { }!

Таким образом:

const char** AST_NODE_TYPE_NAMES = {
     "AST_NODE_CONSTANT",
     "AST_NODE_BINARY",
     "AST_NODE_UNARY",
     "AST_NODE_VARIABLE",
     "AST_NODE_ASSIGNMENT",
     "AST_NODE_STATEMENTS",
};

пытается инициализировать один указатель на указатель на const char садрес первого символа строкового литерала "AST_NODE_CONSTANT", но он не имеет типа const char **, а просто char *.В дополнение к , что , есть 5 избыточных инициализаторов , а именно следующие строки.


Что вы, конечно, хотите сделать, это инициализировать массив,как показывалось P__J __ .

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