The inclusion of the file is done by replacing the include directive with the contents of the included header file (in practice, this is probably not done by replacing in a text stream, but by a semantically equivalent operation).
This means that all files included in the header will be included in the files, including this header, so no, you do not need to include it twice.
However, there are many policies for including files, and choosing one of them is a matter of what you focus on and best practices than what you need to do.
For example, you can strive for completeness and include files whenever you use the characters defined in these files.
I also worked with a project (low-level, cross-platform C library), where the client code was responsible for including dependencies of the header files explicitly before including the header file. This was done in order to preserve explicitly dependent headers and eliminate / minimize (as far as possible) hidden dependency restrictions imposed by the library on clients.
In the end, it is up to you (and / or your team).
source share