Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Using macros cannot resolve recursive references either.
Forum Updated to NodeBB v4.3 + New Features

Using macros cannot resolve recursive references either.

Scheduled Pinned Locked Moved Unsolved General and Desktop
12 Posts 6 Posters 328 Views 2 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.
  • K Offline
    K Offline
    kuqipair
    wrote on 5 Mar 2025, 10:39 last edited by
    #1

    I have three files: classA.h, classB.h, and all_header.h. The details are as follows:

    //classa.h
    #ifndef CLASSA_H
    #define CLASSA_H
    
    #include"all_header.h"
    
    class ClassA
    {
    public:
        ClassA();
        ClassB b1;
    };
    #endif 
    
    //classb.h
    #ifndef CLASSB_H
    #define CLASSB_H
    
    #include"all_header.h"
    
    class ClassB
    {
    public:
        ClassB();
        ClassA* a1;
    };
    #endif // CLASSB_H
    
    
    //all_header.h
    #ifndef ALL_HEADER_H
    #define ALL_HEADER_H
    
    class ClassA;
    class ClassB;
    
    #include"classb.h"
    #include"classa.h"
    
    #endif // ALL_HEADER_H
    
    

    During compilation, the following error occurs:
    error: C2079: 'ClassA::b1' uses undefined class 'ClassB'

    However, when I use the above structure in a standard C++ compiler (whether MSVC or MinGW), it works fine.
    So, why does this happen?

    P J J 3 Replies Last reply 5 Mar 2025, 11:10
    0
    • K kuqipair
      5 Mar 2025, 10:39

      I have three files: classA.h, classB.h, and all_header.h. The details are as follows:

      //classa.h
      #ifndef CLASSA_H
      #define CLASSA_H
      
      #include"all_header.h"
      
      class ClassA
      {
      public:
          ClassA();
          ClassB b1;
      };
      #endif 
      
      //classb.h
      #ifndef CLASSB_H
      #define CLASSB_H
      
      #include"all_header.h"
      
      class ClassB
      {
      public:
          ClassB();
          ClassA* a1;
      };
      #endif // CLASSB_H
      
      
      //all_header.h
      #ifndef ALL_HEADER_H
      #define ALL_HEADER_H
      
      class ClassA;
      class ClassB;
      
      #include"classb.h"
      #include"classa.h"
      
      #endif // ALL_HEADER_H
      
      

      During compilation, the following error occurs:
      error: C2079: 'ClassA::b1' uses undefined class 'ClassB'

      However, when I use the above structure in a standard C++ compiler (whether MSVC or MinGW), it works fine.
      So, why does this happen?

      P Offline
      P Offline
      Pl45m4
      wrote on 5 Mar 2025, 11:10 last edited by
      #2

      @kuqipair

      What macros exactly are you talking about?


      If debugging is the process of removing software bugs, then programming must be the process of putting them in.

      ~E. W. Dijkstra

      K 1 Reply Last reply 5 Mar 2025, 12:36
      1
      • K kuqipair
        5 Mar 2025, 10:39

        I have three files: classA.h, classB.h, and all_header.h. The details are as follows:

        //classa.h
        #ifndef CLASSA_H
        #define CLASSA_H
        
        #include"all_header.h"
        
        class ClassA
        {
        public:
            ClassA();
            ClassB b1;
        };
        #endif 
        
        //classb.h
        #ifndef CLASSB_H
        #define CLASSB_H
        
        #include"all_header.h"
        
        class ClassB
        {
        public:
            ClassB();
            ClassA* a1;
        };
        #endif // CLASSB_H
        
        
        //all_header.h
        #ifndef ALL_HEADER_H
        #define ALL_HEADER_H
        
        class ClassA;
        class ClassB;
        
        #include"classb.h"
        #include"classa.h"
        
        #endif // ALL_HEADER_H
        
        

        During compilation, the following error occurs:
        error: C2079: 'ClassA::b1' uses undefined class 'ClassB'

        However, when I use the above structure in a standard C++ compiler (whether MSVC or MinGW), it works fine.
        So, why does this happen?

        J Offline
        J Offline
        jsulm
        Lifetime Qt Champion
        wrote on 5 Mar 2025, 11:22 last edited by
        #3

        @kuqipair said in Using macros cannot resolve recursive references either.:

        error: C2079: 'ClassA::b1' uses undefined class 'ClassB'

        ClassA::b1 returns ClassB, not ClassB* - this cannot work with forward declaration!

        https://forum.qt.io/topic/113070/qt-code-of-conduct

        K 1 Reply Last reply 5 Mar 2025, 12:47
        3
        • K kuqipair
          5 Mar 2025, 10:39

          I have three files: classA.h, classB.h, and all_header.h. The details are as follows:

          //classa.h
          #ifndef CLASSA_H
          #define CLASSA_H
          
          #include"all_header.h"
          
          class ClassA
          {
          public:
              ClassA();
              ClassB b1;
          };
          #endif 
          
          //classb.h
          #ifndef CLASSB_H
          #define CLASSB_H
          
          #include"all_header.h"
          
          class ClassB
          {
          public:
              ClassB();
              ClassA* a1;
          };
          #endif // CLASSB_H
          
          
          //all_header.h
          #ifndef ALL_HEADER_H
          #define ALL_HEADER_H
          
          class ClassA;
          class ClassB;
          
          #include"classb.h"
          #include"classa.h"
          
          #endif // ALL_HEADER_H
          
          

          During compilation, the following error occurs:
          error: C2079: 'ClassA::b1' uses undefined class 'ClassB'

          However, when I use the above structure in a standard C++ compiler (whether MSVC or MinGW), it works fine.
          So, why does this happen?

          J Offline
          J Offline
          JonB
          wrote on 5 Mar 2025, 11:24 last edited by JonB 3 May 2025, 11:25
          #4

          @kuqipair
          In addition to @Pl45m4 [I posted this before @jsulm's response]

          During compilation, the following error occurs:

          However, when I use the above structure in a standard C++ compiler (whether MSVC or MinGW), it works fine.

          What does the first line mean? You must have used a "standard C++ compiler" when you got the error, but then you say that in a "standard C++ compiler" it works fine... ?

          1 Reply Last reply
          1
          • P Pl45m4
            5 Mar 2025, 11:10

            @kuqipair

            What macros exactly are you talking about?

            K Offline
            K Offline
            kuqipair
            wrote on 5 Mar 2025, 12:36 last edited by
            #5

            @Pl45m4 In both classA. h and classB. h, directly referencing the all_ceader. h file achieves the effect of forward declaration. However, when I do this on QT, I encounter compilation errors.

            P 1 Reply Last reply 5 Mar 2025, 12:46
            0
            • K kuqipair
              5 Mar 2025, 12:36

              @Pl45m4 In both classA. h and classB. h, directly referencing the all_ceader. h file achieves the effect of forward declaration. However, when I do this on QT, I encounter compilation errors.

              P Offline
              P Offline
              Pl45m4
              wrote on 5 Mar 2025, 12:46 last edited by
              #6

              @kuqipair said in Using macros cannot resolve recursive references either.:

              However, when I do this on QT, I encounter compilation errors.

              There is no "Qt"... You use a "standard C++ compiler" when using Qt in your project...
              Also check as @jsulm pointed out:

              @jsulm said in Using macros cannot resolve recursive references either.:

              lassA::b1 returns ClassB, not ClassB* - this cannot work with forward declaration!


              If debugging is the process of removing software bugs, then programming must be the process of putting them in.

              ~E. W. Dijkstra

              1 Reply Last reply
              0
              • J jsulm
                5 Mar 2025, 11:22

                @kuqipair said in Using macros cannot resolve recursive references either.:

                error: C2079: 'ClassA::b1' uses undefined class 'ClassB'

                ClassA::b1 returns ClassB, not ClassB* - this cannot work with forward declaration!

                K Offline
                K Offline
                kuqipair
                wrote on 5 Mar 2025, 12:47 last edited by
                #7

                @jsulm I implemented this in a QT project. I wanted classA.h and classB.h to directly include the all_header.h file to achieve the effect of forward declarations, but this caused compilation failures. However, when I used the same approach in a regular C++ project compiled with both MSVC and MinGW compilers, it worked successfully.

                J 1 Reply Last reply 5 Mar 2025, 12:50
                0
                • K kuqipair
                  5 Mar 2025, 12:47

                  @jsulm I implemented this in a QT project. I wanted classA.h and classB.h to directly include the all_header.h file to achieve the effect of forward declarations, but this caused compilation failures. However, when I used the same approach in a regular C++ project compiled with both MSVC and MinGW compilers, it worked successfully.

                  J Offline
                  J Offline
                  JonB
                  wrote on 5 Mar 2025, 12:50 last edited by
                  #8

                  @kuqipair
                  Then start by comparing the exact compilation lines executed in the Qt and non-Qt case, to see where the difference is.

                  K 1 Reply Last reply 5 Mar 2025, 13:04
                  0
                  • J JonB
                    5 Mar 2025, 12:50

                    @kuqipair
                    Then start by comparing the exact compilation lines executed in the Qt and non-Qt case, to see where the difference is.

                    K Offline
                    K Offline
                    kuqipair
                    wrote on 5 Mar 2025, 13:04 last edited by
                    #9

                    @JonB Ah-ha, I figured it out!
                    I consulted DeepSeek-R1, and it suggested explicitly defining the precompiled header in the .pro file like this:

                    PRECOMPILED_HEADER = all_header.h
                    CONFIG += precompile_header
                    

                    Big thanks to the amazing open-source AI models from my great motherland (China) - they're truly phenomenal! Highly recommended!

                    J 1 Reply Last reply 5 Mar 2025, 13:10
                    0
                    • K kuqipair
                      5 Mar 2025, 13:04

                      @JonB Ah-ha, I figured it out!
                      I consulted DeepSeek-R1, and it suggested explicitly defining the precompiled header in the .pro file like this:

                      PRECOMPILED_HEADER = all_header.h
                      CONFIG += precompile_header
                      

                      Big thanks to the amazing open-source AI models from my great motherland (China) - they're truly phenomenal! Highly recommended!

                      J Offline
                      J Offline
                      JonB
                      wrote on 5 Mar 2025, 13:10 last edited by JonB 3 May 2025, 13:13
                      #10

                      @kuqipair
                      Had no idea you were using, or wanted to use, precompiled headers.
                      Still doesn't tell me why you would need to: either it's legal C++ or it isn't, don't know why making it precompiled would alter that, but never mind.

                      1 Reply Last reply
                      0
                      • Christian EhrlicherC Offline
                        Christian EhrlicherC Offline
                        Christian Ehrlicher
                        Lifetime Qt Champion
                        wrote on 5 Mar 2025, 13:11 last edited by
                        #11

                        No need for some obscure AI here - simply fix your project structure to avoid recursive includes as this is a big sign for a design flaw. Also use forwarding of classes instead direct includes to reduce compile times.

                        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                        Visit the Qt Academy at https://academy.qt.io/catalog

                        1 Reply Last reply
                        1
                        • S Offline
                          S Offline
                          SimonSchroeder
                          wrote on 6 Mar 2025, 07:56 last edited by
                          #12

                          Headers alone don't do anything. Suppose you have a classb.cpp that just includes classb.h. This header first declares the macro CLASSB_H. Then you go on to include all_header.h from classb.h. This first includes classb.h followed by classa.h. However, when including classb.h from all_header.h (included from classb.h) CLASSB_H is already defined and the inclusion returns nothing. So far, ClassB has not been defined. Then you go on including classa.h which expects a full definition of ClassB.

                          This problem only occurs when including classb.h (before any of the other two headers). It is not a problem when including classa.h or all_header.h (first). Using all_header.h as a pre-compiled header will include all_header.h before everything else in every translation unit. That's why this solution works. But IMHO this is not a proper solution because source code should always also compile without precompiled headers. Especially in this scenario a change in ClassA or ClassB will trigger a recompile of the precompiled header and thus a recompile of your whole project. This is not a tenable solution for large projects. Precompiled headers should be reserved for third-party libraries that (almost) never change. It is not meant for your own source code. (Precompiled headers are supposed to reduce compilation times and not increase them.)

                          I am not sure what a good solution to this problem is. Most likely it works by removing the include guards for all_header.h. I believe these are (in this specific context) not actually needed.

                          1 Reply Last reply
                          2

                          3/12

                          5 Mar 2025, 11:22

                          topic:navigator.unread, 9
                          • Login

                          • Login or register to search.
                          3 out of 12
                          • First post
                            3/12
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved