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

4

Я прочитал в стандарте 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 В обеих ситуациях написано «сделано».

Благодарю.

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

Ваш Ответ

3   ответа
7

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

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

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

4

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

4

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

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

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

Похожие вопросы