- The #include directive doesn't discriminate file types (it's just a glorified copy-paste operation) - no automatic adding of .h is happening.
- C++ standard header files are provided without the .h extension
- Sometimes backward compatibility header files are provided by the vendor with the same name with the .h extension added
It all has to do with namespaces. The .h counterparts for C++ standard headers usually #includes the proper C++ standard header (without .h extension) and then issues a bunch of using (something like this):
FILE: iostream.h
#include <iostream>
using std::iostream;
using std::ostream;
using std::ios;
...
whereas the headerfile without the .h extension does not pollute the namespace with all the defined classes and types.