В именовании файлов должна быть и логика, и практичность.
Например, использование расширения .h для заголовочных файлов С++, как по мне, и не логично, и не практично.
Нелогично с точки зрения того, .h используется в чистом Си. И казалось бы, если у нас есть некий foo.h, то его можно было бы подключить и в .c-файле, ведь софт на Си все еще пишут. И иногда в Си-шный софт подключают фрагменты, написанные на C++, выставляющие наружу чисто Си-шный интерфейс. Но нет, оказывается, что в .h лежит не C, а C++.
Непрактично с точки зрения поиска в исходных текстах. Например, у меня есть каталог с исходниками, хочу найти те файлы, в которых встречается какая-то подстрока. Какую маску имен файлов задавать для grep? А если у меня в распоряжении не grep, а FAR Manager в Windows? Или если я привык пользоваться Midnight Commander и не хочу бодаться с дедовским grep?
Гораздо удобнее использовать расширения .hpp для заголовочных, и .cpp для файлов реализации. Ну или .hxx и .cxx.
Почему?
Во-первых, сразу видно, что мы имеем дело с C++ и не можем задействовать заголовочный файл в чисто Си-шном коде.
Во-вторых, маски поиска (хоть для grep, хоть для FAR, хоть для MC) задаются не просто, а очень просто: *.?pp (ну или *.[hc]pp для тех, кто любит точность).
А расширение .h в C++ных проектах нужно оставить для кода, который совместим с чистым Си.
Я еще применяю расширение .ipp. Обычно для файлов, которые содержат куски кода не являющиеся самостоятельными и самодостаточными, а предназначены для включения в другие исходные файлы посредством #include. Иногда это куски кода, которые сгенерированы внешними инструментами.
Удобство расширения .ipp в том, что оно попадает под ту же самую маску поиска: *.?pp.
Да, я знаю, что модули C++ убирают проблему именования заголовочных файлов. Но в моей вселенной прекрасное будущее с модулями C++ еще не наступило. Так что пока маемо шо маемо.
А вот на счет адекватности людей, пропихнувших модули в C++ у меня есть сомнения. Но это уже совсем другая история.
Не использование расширения для имен заголовочных файлов -- это вообще идиотия. И если для имен заголовочных файлов стандартной библиотеки такое еще простительно, то вот для других типов проектов -- нет.