Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. The Lounge
  3. My Great Idea

My Great Idea

Scheduled Pinned Locked Moved The Lounge
linuxhelptutorial
21 Posts 12 Posters 2 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    B Offline
    BernardIE5317
    wrote on last edited by
    #1

    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.

    Greg UtasG D C H K 11 Replies Last reply
    0
    • B BernardIE5317

      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.

      Greg UtasG Offline
      Greg UtasG Offline
      Greg Utas
      wrote on last edited by
      #2

      This was the original reason I started to develop my C++ static analysis tool. All you need to do is switch to C++11 or enhance it to support C++20! There is also Include What You Use[^]. I haven't looked into it, but it might do what you need. EDIT: Pruning #include directives to the minimal set that compiles isn't a good idea because it fails to account for headers that get included transitively but that should nevertheless be included.

      Robust Services Core | Software Techniques for Lemmings | Articles
      The fox knows many things, but the hedgehog knows one big thing.

      <p><a href="https://github.com/GregUtas/robust-services-core/blob/master/README.md">Robust Services Core</a>
      <em>The fox knows many things, but the hedgehog knows one big thing.</em></p>

      B 1 Reply Last reply
      0
      • B BernardIE5317

        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.

        D Offline
        D Offline
        dandy72
        wrote on last edited by
        #3

        It's been a while I've used C++ (and thus #include statements), as I've been doing C# exclusively for about 15 years now, but if I find myself in a situation where I have to add a 'using' statement without understanding why I need it...then I consider this a problem I need to solve (understand why it's needed), rather than adding it and shrugging it off and concluding "whatever works"...

        1 Reply Last reply
        0
        • B BernardIE5317

          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.

          C Offline
          C Offline
          charlieg
          wrote on last edited by
          #4

          here you go: http://lh3.ggpht.com/_fPLo8aIju-A/TMpE-ErkX9I/AAAAAAAAPQo/EwtHX5QRLRU/s1600/28667_strip%5B3%5D.gif[^] Debugging #includes has been the bane forever....

          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.

          B 1 Reply Last reply
          0
          • Greg UtasG Greg Utas

            This was the original reason I started to develop my C++ static analysis tool. All you need to do is switch to C++11 or enhance it to support C++20! There is also Include What You Use[^]. I haven't looked into it, but it might do what you need. EDIT: Pruning #include directives to the minimal set that compiles isn't a good idea because it fails to account for headers that get included transitively but that should nevertheless be included.

            Robust Services Core | Software Techniques for Lemmings | Articles
            The fox knows many things, but the hedgehog knows one big thing.

            B Offline
            B Offline
            BernardIE5317
            wrote on last edited by
            #5

            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

            Greg UtasG 1 Reply Last reply
            0
            • B BernardIE5317

              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.

              H Offline
              H Offline
              honey the codewitch
              wrote on last edited by
              #6

              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.

              B C 2 Replies Last reply
              0
              • C charlieg

                here you go: http://lh3.ggpht.com/_fPLo8aIju-A/TMpE-ErkX9I/AAAAAAAAPQo/EwtHX5QRLRU/s1600/28667_strip%5B3%5D.gif[^] Debugging #includes has been the bane forever....

                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.

                B Offline
                B Offline
                BernardIE5317
                wrote on last edited by
                #7

                I am surprised a commercial product does not exist to debug #includes making it effortless. It seems to me it would be simple enough to a programmer knowledgeable of compiler writing i.e. to wit merely scan the code identify all the identifiers and their signatures when needed and Voila Presto Bingo. How can such a product not sell like hot cakes. Apparently there is something I do not understand.

                1 Reply Last reply
                0
                • H honey the codewitch

                  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.

                  B Offline
                  B Offline
                  BernardIE5317
                  wrote on last edited by
                  #8

                  By tree I assume you mean nested/transitive if that's the right term. Doesn't that leave me w/ the same problem i.e. each file whether cpp or h still needs certain #include's and in a certain order. As you clearly are a better programmer than I there must be something I do not understand. As for relying on the order of #include's I gave up attempting to make each independent of any other after scratching my head raw.

                  H 1 Reply Last reply
                  0
                  • B BernardIE5317

                    By tree I assume you mean nested/transitive if that's the right term. Doesn't that leave me w/ the same problem i.e. each file whether cpp or h still needs certain #include's and in a certain order. As you clearly are a better programmer than I there must be something I do not understand. As for relying on the order of #include's I gave up attempting to make each independent of any other after scratching my head raw.

                    H Offline
                    H Offline
                    honey the codewitch
                    wrote on last edited by
                    #9

                    It leaves the same problem, but it creates potentially more organization. The better alternative is to reduce the number of cross header dependencies, or restructure the dependencies into common headers included by each of the downstream headers. This of course isn't possible if you don't "own" the code in those headers, and in any case, it's probably a lot of work to restructure it as above. So I'm not saying your tool doesn't have merit. I'm just saying if you need it, you might want to take a second look at how things are structured.

                    To err is human. Fortune favors the monsters.

                    1 Reply Last reply
                    0
                    • B BernardIE5317

                      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

                      Greg UtasG Offline
                      Greg UtasG Offline
                      Greg Utas
                      wrote on last edited by
                      #10

                      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 or enum 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.

                      <p><a href="https://github.com/GregUtas/robust-services-core/blob/master/README.md">Robust Services Core</a>
                      <em>The fox knows many things, but the hedgehog knows one big thing.</em></p>

                      B 1 Reply Last reply
                      0
                      • Greg UtasG Greg Utas

                        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 or enum 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.

                        B Offline
                        B Offline
                        BernardIE5317
                        wrote on last edited by
                        #11

                        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.

                        Greg UtasG 1 Reply Last reply
                        0
                        • B BernardIE5317

                          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.

                          K Offline
                          K Offline
                          k5054
                          wrote on last edited by
                          #12

                          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

                          1 Reply Last reply
                          0
                          • B BernardIE5317

                            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.

                            Greg UtasG Offline
                            Greg UtasG Offline
                            Greg Utas
                            wrote on last edited by
                            #13

                            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.

                            <p><a href="https://github.com/GregUtas/robust-services-core/blob/master/README.md">Robust Services Core</a>
                            <em>The fox knows many things, but the hedgehog knows one big thing.</em></p>

                            1 Reply Last reply
                            0
                            • B BernardIE5317

                              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.

                              M Offline
                              M Offline
                              Member 9167057
                              wrote on last edited by
                              #14

                              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.

                              1 Reply Last reply
                              0
                              • B BernardIE5317

                                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.

                                F Offline
                                F Offline
                                Fueled By Decaff
                                wrote on last edited by
                                #15

                                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.

                                1 Reply Last reply
                                0
                                • B BernardIE5317

                                  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.

                                  S Offline
                                  S Offline
                                  Samuel Ervin
                                  wrote on last edited by
                                  #16

                                  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.

                                  1 Reply Last reply
                                  0
                                  • B BernardIE5317

                                    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.

                                    P Offline
                                    P Offline
                                    PhilipOakley
                                    wrote on last edited by
                                    #17

                                    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.

                                    1 Reply Last reply
                                    0
                                    • B BernardIE5317

                                      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.

                                      M Offline
                                      M Offline
                                      Matthew Barnett
                                      wrote on last edited by
                                      #18

                                      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.

                                      1 Reply Last reply
                                      0
                                      • B BernardIE5317

                                        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.

                                        2 Offline
                                        2 Offline
                                        240DL
                                        wrote on last edited by
                                        #19

                                        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

                                        1 Reply Last reply
                                        0
                                        • H honey the codewitch

                                          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.

                                          C Offline
                                          C Offline
                                          charlieg
                                          wrote on last edited by
                                          #20

                                          "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.

                                          H 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups