I find that a strict coding style can make this easier to implement, and more likely to restrict warnings to the code that you directly control.<p>For example, I used a module prefix consistently in my code so that any occurrence of an &quot;Xyz_&quot; prefix in a file would pretty much <i>guarantee</i> that &quot;Xyz.h&quot; is required to compile.  I also put all local #include references in the same part of the file under a predictable comment header.  That way, I didn&#x27;t need a C++ parser; I just needed to know where to start searching for the list of headers, infer prefixes from their names, and complain about prefixes that were not found in the rest of the file.  This has worked surprisingly well, and I can tune the script to skip modules for any reason.<p>This is also important for the reverse case.  I don&#x27;t really <i>need</i> an IDE or ctags to figure out what file is needed for a #include in most cases because I have the name of the function&#x2F;type&#x2F;constant&#x2F;etc. to guide me.  Similarly, I know exactly what file to open in my editor without using magic tricks.  (Although, code completion and jump-to-definition are still quite helpful, especially for things like OS calls that may follow no particular convention.)