My Great Idea
-
Thanks for informing me of the tools. I would greatly like to develop a C++20 version but would need to be a x10 programmer to add another project to my current efforts. As I am more of a 1/x10 programmer as I am always surprised how little I accomplish in most days unless of course I blame my pig of a machine which I am beginning to lean toward as I often find myself drumming my fingers instead of typing with them it will have to wait though perhaps I could dabble at it from time to time. I will look into IWYU. Thanks. I looked into checkheaders but found it reported many incorrect "... not needed" messages unless of course I utilized it improperly which is always a possibility. As for transitive #includes I assume that refers to nested which I do not do. All my #includes are only in cpp files. - Best
By transitive, I mean if A includes B, and B includes C, then A sees C transitively, so A will compile even if it should also include C. For example, if C defines a base class, which B derives, with A then deriving from B, there is no need for A to include C. But in other cases (C using a free function, or a bare
typedef
orenum
in A), C should include A.Robust Services Core | Software Techniques for Lemmings | Articles
The fox knows many things, but the hedgehog knows one big thing. -
By transitive, I mean if A includes B, and B includes C, then A sees C transitively, so A will compile even if it should also include C. For example, if C defines a base class, which B derives, with A then deriving from B, there is no need for A to include C. But in other cases (C using a free function, or a bare
typedef
orenum
in A), C should include A.Robust Services Core | Software Techniques for Lemmings | Articles
The fox knows many things, but the hedgehog knows one big thing.Thank you for the clarification. The last statement confuses me. Should it not be "C should include A" as C is using an identifier defined in A.
-
I had a great idea this morning upon waking up. I don't know how to figure out which #include's are needed to compile any particular source other than tedious error prone inspection followed by numerous compilations #include'ing one by one any file to resolve the latest error. The great idea was to automate the process by compiling every possible combination [1...40] subsets of the 40 #include's in my project and settling on the combination with the smallest number needed for an error free compile. This could easily be done via awk to automate the insertion of the #include statements. However a calculation of the number of possible combinations of 40 files in every possible subset number resulted in "inf" appearing on my monitor so I guess it won't work at least not on my pig of a machine. I guess I will have to wait for entangled bits.
I'm sure there's tools to do this. Maybe something like CPPDepend? [Dependency Graph](https://www.cppdepend.com/Doc\_VS\_Arch) That seems to be a commercial tool, I've not used it, so I can't comment on whether it actually works or not, but it seems like it might give you what you're looking for. Maybe search results for "C++ include dependency graph" or similar might lead you to what you're looking for.
Keep Calm and Carry On
-
Thank you for the clarification. The last statement confuses me. Should it not be "C should include A" as C is using an identifier defined in A.
Quite right. I'll fix it.
Robust Services Core | Software Techniques for Lemmings | Articles
The fox knows many things, but the hedgehog knows one big thing. -
I had a great idea this morning upon waking up. I don't know how to figure out which #include's are needed to compile any particular source other than tedious error prone inspection followed by numerous compilations #include'ing one by one any file to resolve the latest error. The great idea was to automate the process by compiling every possible combination [1...40] subsets of the 40 #include's in my project and settling on the combination with the smallest number needed for an error free compile. This could easily be done via awk to automate the insertion of the #include statements. However a calculation of the number of possible combinations of 40 files in every possible subset number resulted in "inf" appearing on my monitor so I guess it won't work at least not on my pig of a machine. I guess I will have to wait for entangled bits.
This bloody #include hell is huge reason why I'm looking forward to widespread standard module support. Until then, I combine all the external includes into one header & include that.
-
I had a great idea this morning upon waking up. I don't know how to figure out which #include's are needed to compile any particular source other than tedious error prone inspection followed by numerous compilations #include'ing one by one any file to resolve the latest error. The great idea was to automate the process by compiling every possible combination [1...40] subsets of the 40 #include's in my project and settling on the combination with the smallest number needed for an error free compile. This could easily be done via awk to automate the insertion of the #include statements. However a calculation of the number of possible combinations of 40 files in every possible subset number resulted in "inf" appearing on my monitor so I guess it won't work at least not on my pig of a machine. I guess I will have to wait for entangled bits.
Does the order of the includes matter? If not you could include all of them to check the project compiles, then remove them one by one and adding them back if removing them breaks the compile. 40! is 8.1591528e+47 according to Google. That would take a while to work through.
-
I had a great idea this morning upon waking up. I don't know how to figure out which #include's are needed to compile any particular source other than tedious error prone inspection followed by numerous compilations #include'ing one by one any file to resolve the latest error. The great idea was to automate the process by compiling every possible combination [1...40] subsets of the 40 #include's in my project and settling on the combination with the smallest number needed for an error free compile. This could easily be done via awk to automate the insertion of the #include statements. However a calculation of the number of possible combinations of 40 files in every possible subset number resulted in "inf" appearing on my monitor so I guess it won't work at least not on my pig of a machine. I guess I will have to wait for entangled bits.
Not a bad idea, but how do you exclude circular dependencies from cropping up in this case. Not all of them are caught at compile time which you could run the risk of introducing them into your application with a just get it to compile mindset.
-
I had a great idea this morning upon waking up. I don't know how to figure out which #include's are needed to compile any particular source other than tedious error prone inspection followed by numerous compilations #include'ing one by one any file to resolve the latest error. The great idea was to automate the process by compiling every possible combination [1...40] subsets of the 40 #include's in my project and settling on the combination with the smallest number needed for an error free compile. This could easily be done via awk to automate the insertion of the #include statements. However a calculation of the number of possible combinations of 40 files in every possible subset number resulted in "inf" appearing on my monitor so I guess it won't work at least not on my pig of a machine. I guess I will have to wait for entangled bits.
You could try the technique used in the Git project. Firstly, they do have two two top level `.h` files that are always included as the first lines in any other file that will need includes. This provides a level commonality across the project, and a consistent inclusion order. Secondly, and slightly more important for you, is that all the included `.h` files have a preamble/suffix of:
#ifndef _H
#define _H */Thus stuff is included only once and a hierarchy of usage is created. Add
#else /* warnings */
for extra feedback and local tastes.
-
I had a great idea this morning upon waking up. I don't know how to figure out which #include's are needed to compile any particular source other than tedious error prone inspection followed by numerous compilations #include'ing one by one any file to resolve the latest error. The great idea was to automate the process by compiling every possible combination [1...40] subsets of the 40 #include's in my project and settling on the combination with the smallest number needed for an error free compile. This could easily be done via awk to automate the insertion of the #include statements. However a calculation of the number of possible combinations of 40 files in every possible subset number resulted in "inf" appearing on my monitor so I guess it won't work at least not on my pig of a machine. I guess I will have to wait for entangled bits.
Instead of inserting until there are no errors, have you tried deleting until there's an error and then re-inserting it? When you can't delete any without causing an error, you've finished.
-
I had a great idea this morning upon waking up. I don't know how to figure out which #include's are needed to compile any particular source other than tedious error prone inspection followed by numerous compilations #include'ing one by one any file to resolve the latest error. The great idea was to automate the process by compiling every possible combination [1...40] subsets of the 40 #include's in my project and settling on the combination with the smallest number needed for an error free compile. This could easily be done via awk to automate the insertion of the #include statements. However a calculation of the number of possible combinations of 40 files in every possible subset number resulted in "inf" appearing on my monitor so I guess it won't work at least not on my pig of a machine. I guess I will have to wait for entangled bits.
When I want to debug things related to header inclusion, I typically run the compiler in preprocessor-only mode and scan the output. vc /P ... or ... gcc -E You've tried this? The preprocessed output sometimes shows some interesting things and might be good input for a tool chain. -- Matt
-
I feel like such a tool would belong in the weird and the wonderful. I hate to say this, but if your includes are so heavily dependent on ordering you are almost certainly due for a restructure of your code. For example, it might be better to do the includes as more of a tree in terms of what includes what than you currently have it. There are a number of ways to deal with it but it all has to do with structure. Edit: I'm not saying this is certainly the issue in your case. It just smells from here. My spidey sense is tingling.
To err is human. Fortune favors the monsters.
-
"my spider sense..." lol. well put
Charlie Gilley “They who can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.” BF, 1759 Has never been more appropriate.
technically it was "spidey" - comes from the old spiderman comics. :)
To err is human. Fortune favors the monsters.