Я знаю, что объявление функции (или указателя функции) без списка параметров (и без указания void
в списке параметров) означает, что функция (или функция указатель) имеет неизвестное количество аргументов.Указатель функции «назначение из несовместимого типа указателя» только при использовании vararg ellipsis
Я написал несколько сценариев тестирования, чтобы проверить это поведение вне:
int my_func_1() {
return(0);
}
int my_func_2(int x) {
return(x);
}
int my_func_3(char x, ...) {
va_list va;
va_start(va, x);
return(va_arg(va, int));
}
int (*fp)();
fp = my_func_1;
printf("%d\n", fp());
fp = my_func_2;
printf("%d\n", fp(33));
fp = my_func_3;
printf("%d\n", fp(33, 44));
Что я составил на 64 битной машине под Linux как таковой:
gcc test.c -Wextra -pedantic -std=c1x -O3 -o test
Выход правильно:
0
33
44
Но я получаю это предупреждение: assignment from incompatible pointer type
. Почему это предупреждение появляется только при использовании эллипса vararg?
Поскольку тип указателя считается неполным, его полный тип не должен составлять «назначение из несовместимого типа указателя». Более того, назначение полных типов работает без каких-либо предупреждений, если нет эллипса vararg.
Этот вопрос other задает почти то же самое. Ответы все в строке «это не работает», без четкой ссылки на стандарт о том, почему это не сработает.
- Почему компилятор генерирует предупреждение?
- Надежное ли это поведение (предупреждение в сторону)?
- Является ли это специфическим компилятором поведения (прочитав другой вопрос, похоже, что mingw x86_64 не поддерживал его в 2011 году)?
- Является ли это поведение конкретной платформой?
Зачем беспокоиться об этом? Никакой разумный код C в этом столетии не использует бесцельные прототипы. * Ответы все в строке «это не работает» * - нет, принятый ответ говорит, что это неопределенное поведение. –
Мне просто интересно; У меня есть достойное понимание внутренности C, и когда я вижу возможность испытать мое понимание/предположения и т. Д., Я иду на это. –
Ваш вопрос выходит за рамки этого. например, вы спрашиваете, является ли поведение надежным ... ну, UB не является надежным. –