Краткий ответ:
Уберите: чем раньше предупреждение компилятора, тем лучше.
Q1: значение .h: согласованность и ранние оповещения. Раннее оповещение о распространенных способах неправильной работы повышает надежность кода и сводит к минимуму отладку и производственные сбои.
Q2: Столкновение с именами дает разработчикам ранние предупреждения, которые обычно легче исправить.
В3. Ранние предупреждения о дублировании не включаются в стандарт C.
Упражнения:
1. Определите функцию в одном файле, которая printf ("% d \ n", i) аргумент int, затем вызовите эту функцию в другом файле с плавающей точкой 42.0.
2. Позвоните с (двойной) 42,0.
3. Определите функцию с аргументом char * str, напечатанным в% .s, затем вызовите с аргументом int.
Более длинные ответы:
Популярное соглашение: при типичном использовании имя файла .h происходит от файла .c или файлов, с которыми оно связано. file.h и file.c. Для файлов .h со многими определениями, скажем, string.h, выведите имя файла с точки зрения того, что находится внутри (как в функциях str ...).
Мое большое правило: всегда лучше структурировать ваш код, чтобы компиляторы могли сразу же предупреждать об ошибках во время компиляции, а не позволять им скользить в отладке или во время выполнения, когда они зависят от кода, который выполняется на самом деле, как раз для правильного поиска. Ошибки во время выполнения могут быть очень трудно диагностировать, особенно если они появляются очень долго после того, как программа запущена в производство, и дороги в обслуживании и снижают качество обслуживания клиентов. Смотрите "обозначение йода".
Q1: значение .h: согласованность и ранние оповещения и повышение надежности кода.
C .h файлы позволяют разработчикам .c файлов, скомпилированных в разное время, обмениваться общими объявлениями. Нет повторяющегося кода. Файлы .h также позволяют последовательно вызывать функции из всех файлов, одновременно выявляя неправильные подписи аргументов (количество аргументов, плохие конфликты и т. д.). Наличие .c файлов, определяющих функции, также #include .h файл помогает гарантировать, что аргументы в определении согласуются с вызовами; это может показаться элементарным, но без этого могут проникнуть все человеческие ошибки в сигнатурных столкновениях.
Пропуск файлов .h работает только в том случае, если подписи аргументов всех вызывающих абонентов полностью совпадают с сигнатурами в определениях. Часто это не так, поэтому без файлов .h любые конфликтующие подписи будут давать неверные числа, если у вас также не будет параллельных внешних символов в вызывающем файле (плохие плохие плохие). Такие вещи, как int vs float, могут давать совершенно неверные значения аргументов. Плохие указатели могут привести к ошибкам сегмента и другим общим сбоям.
Преимущество: с помощью externs в .h файлах компиляторы могут корректно приводить несоответствующие аргументы к правильному типу, обеспечивая лучшие вызовы. Хотя вы все еще можете опровергнуть аргументы, это гораздо менее вероятно. Это также помогает избежать условий, когда несоответствия работают в одной реализации, но не в другой.
Предупреждения о неявном объявлении чрезвычайно полезны для меня, поскольку они обычно указывают, что я забыл .h файл или записал имя с неверным внешним именем.
Q2: столкновение имен. Ранние оповещения.
Конфликтующие имена - это плохо, и разработчики обязаны избегать проблем. C ++ решает проблему с пространствами имен, которых нет в C, как языке более низкого уровня.
Использование файлов .h может позволить диагностике компилятора предупредить разработчиков, когда возникновение конфликтов происходит на ранних стадиях игры. Если диагностика компилятора не делает этого, мы надеемся, что компоновщики сделают это при множественных ошибках символов, но это не гарантируется стандартом.
Распространенным способом подделки пространств имен является запуск всех потенциально конфликтующих определений в .h с некоторым префиксом (extern int filex_function1 (int arg, char * string) или #define FILEX_DEF 42).
Что делать, если две разные используемые внешние библиотеки имеют одинаковые имена, выходят за рамки этого ответа.
Q3: ранние дубликаты предупреждений. Извините ... ранние оповещения зависят от реализации.
Этобыло бы трудно определить стандарт Си. Поскольку C является старым языком, существует множество различных способов написания и хранения программ на C.
Охота за конфликтами имен перед их использованием остается за разработчиком. Инструменты, такие как программы перекрестных ссылок, могут помочь. Даже такие глупости, как ctags, связанные с vim или emacs, могут помочь.