Что конкретно означают эти два C-предупреждения? - PullRequest
1 голос
/ 30 августа 2011

имеют следующий код C:

typedef void*(m3_func)(void);
#define NULL ((void*)0)

char* lolinfo()
{
    return "You got the additional info! :D";
}

m3_func** m3_funcs() {
    return (m3_func**) {
        (m3_func*)(&lolinfo), // warning #1
        NULL
    }; // warning #2
}

Я получаю эти предупреждения:

  • / home / lk / proj / m3 / m3_lolauncher / lolauncher.c (0,0): Предупреждение: инициализация из несовместимого типа указателя (m3_lolauncher)
  • / home / lk / proj / m3 / m3_lolauncher / lolauncher.c (0,0): Предупреждение: лишние элементы в скалярном инициализаторе (m3_lolauncher)

Я не понимаю первого, как правильно произнесу?

Я никогда не видел второй ...

Ответы [ 2 ]

3 голосов
/ 30 августа 2011

похоже, ваш пример кода недействителен C.

Если я понимаю ваш код, функция m3_funcs() должна возвращать массив функциональных указателей с нулевым символом в конце. вы на самом деле пытаетесь использовать инициализатор ({...}) для объявления массива и его немедленного возврата. но я не думаю, что вы можете использовать инициализатор вне объявления переменной ... также обратите внимание, что эта "переменная" будет существовать только в контексте вызова m3_funcs(), поэтому адрес, который в конечном итоге может быть возвращен, не будет больше быть действительным после того, как функция вернулась.

правильный способ реализовать такую ​​функцию - иметь статическую глобальную переменную и возвращать ее адрес:

static m3_func *m3_funcs_array[] = {(m3_func *)&lolinfo, NULL};

m3_func ** m3_funcs()
{
    return &m3_funcs_array;
}
1 голос
/ 30 августа 2011

Инициализация списка будет:

a = { b,c,d }

Здесь вы используете новую универсальную инициализацию (x{y}). Следовательно, вы пытаетесь инициализировать один указатель m3_func** с двумя указателями m3_func*. Поэтому у вас есть два предупреждения:

  1. инициализация из несовместимого типа указателя (m3_func**! = m3_func*)
  2. лишние элементы в скалярном инициализаторе (указатель является скаляром, и вы пытаетесь инициализировать его двумя указателями - следовательно, один избыточный)
...