неявное int и неявное объявление функций с помощью компилятора gcc

Я прочитал в стандарте C99:

-remove implicit function declaration,

-remove implicit int.

Но когда я пытаюсь скомпилировать этот код с помощью компилятора gcc в режиме c99, используя -pedantic

main(void){
    f(3);
    return 0;
}


int f(int a){
    ....
}

Я ожидаю 2 ошибки, но я просто получаю 2 предупреждения:

-warning: return type defaults to ‘int’

-warning: implicit declaration of function ‘f’.

Должны ли они быть ошибками в c99?

http://gcc.gnu.org/c99status.html В обеих ситуациях написано «сделано».

Благодарю.

 Daniel Fischer23 июн. 2012 г., 19:49
-pedantic просто означает быть педантичным в сообщении пользователю. Если вы хотите, чтобы компилятор останавливал компиляцию при обнаружении таких вещей, используйте-pedantic-errors, Тем не мение,-Werror может быть даже лучше (в сочетании с-Wall -Wextra), так как даже предупреждения, не требуемые стандартом, нежелательны.
 Alok Save23 июн. 2012 г., 18:32
Поверьте, это просто устарело, а не удалено.
 Keith Thompson23 июн. 2012 г., 18:52
@ Алс: Нет, C99 полностью удалил его.

Ответы на вопрос(3)

Я не верю, что компиляторrequired произвести фатальную ошибку. использование-Werror если вы обеспокоены ...

Два момента: во-первых, может потребоваться (как правило, требуется) определенный набор флагов, чтобы компилятор соответствовал стандарту.

Во-вторых, все, что требуется стандартом, состоит в том, что реализация выдает «диагностическую» информацию. в случае ошибки - но это зависит от реализации, чтобы определить, что является или не является диагностическим. Вы можете сказать "предупреждение" это диагностика, если он хочет. Когда выдается диагностика, она может прекратить компиляцию или в любом случае может скомпилировать код.

Итог: того, что он делает, вероятно, достаточно, чтобы соответствовать, во что бы то ни стало.

Решение Вопроса

Стандарт C требуетdiagnostic для любой единицы перевода, содержащей нарушение правила синтаксиса или ограничения. Это не требует, чтобы такая диагностика была фатальной; Компилятор может продолжить обработку исходного файла. Поведение результирующего исполняемого файла, если оно есть, не определено. Стандарт не делает различий между предупреждениями и фатальными ошибками.

(Единственное чтоrequires компилятор для отклонения исходного файла является#error директива.)

Вывод: при компиляции C принимайте предупреждения очень серьезно.

Ваш ответ на вопрос