От K & R Книга на C, я понял, что если объявление прототипа функции опускает аргументы (как в int foo();
), проверка типов и аргументов отключена, и ничего не предполагается относительно аргументов быть совместимым со старыми версиями C и поэтому он не нарушает устаревший код.Функциональный прототип - Отключение проверки аргументов
Но следующий код вызывает ошибку компиляции, что несоответствие прототипов:
#include <stdio.h>
void test();
int main(void) {
test(34.5f);
}
void test(float a) {
printf("%f\n", a);
}
Ошибка:
C:\***.c:7:6: error: conflicting types for 'test'
void test(float a) {
^
Любые объяснения?
gcc добавляет: 'примечание: тип аргумента с объявлением по умолчанию не может совпадать с объявлением списка пустых параметров', поэтому 'void test (double a)' работает, но 'void test (float a)' doesn «т. Таким образом, кажется, что «проверка типов и аргументов отключена и ничего не принимается в отношении аргументов» - это упрощение. Вы должны обратиться к спецификации C, чтобы узнать, что такое правило. – ikegami
См. Http://stackoverflow.com/questions/1630631/alternative-kr-c-syntax-for-function-declaration-versus-prototypes. Этот вопрос может рассматриваться некоторыми как дубликат этого и завершаться закрытым. –
Компилятор ожидает определения 'void test (double a) {}', как 'test (34.5f);' call включает в себя _default arguments promotionions, что имеет место, если данное объявление не служит прототипом. Одним из таких продвижений является 'float ---> double'. –