 <p>While the exact naming is a convention, the difference between the treatment of header files and source files is not -- header files are <strong>not</strong> compiled into object files, but included in source files (collectively forming translation units). Moreover they may be included in multiple source files, so that multiple source files share the same <strong>definitions</strong>. The semantics of the files may be the same, but the compiler treats them differently, because of their usage.</p> <p>As far as naming goes, personally I've seen at least these -- <code>*.h</code>, <code>*.H</code> (ugh), <code>*.hpp</code>, <code>*.hxx</code>, <code>*.hh</code>, <code>*.inl</code> (for normal headers, not just inlined code -- yuck). Usually accompanied by a matching object file extension. </p> <p>Note that standard library headers <strong>don't have an extension</strong> -- e.g. string.</p> <p>So it's all a matter of taste and conventions -- what you will <code>#include</code>, that will be included.</p>