Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Special Interest Groups
  3. C++ Gurus
  4. Fixing `-Wincompatible-pointer-types` compiler warning
Forum Updated to NodeBB v4.3 + New Features

Fixing `-Wincompatible-pointer-types` compiler warning

Scheduled Pinned Locked Moved Unsolved C++ Gurus
24 Posts 5 Posters 16.3k Views 4 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.
  • aha_1980A aha_1980

    @kshegunov I'll try that tomorrow. Sounds like a clever, reuseable, and clean macro solution :)

    kshegunovK Offline
    kshegunovK Offline
    kshegunov
    Moderators
    wrote on last edited by
    #12

    @aha_1980 said in Fixing `-Wincompatible-pointer-types` compiler warning:

    and clean macro solution

    As much as such a thing exists ;P

    Read and abide by the Qt Code of Conduct

    aha_1980A 1 Reply Last reply
    2
    • kshegunovK kshegunov

      @aha_1980 said in Fixing `-Wincompatible-pointer-types` compiler warning:

      and clean macro solution

      As much as such a thing exists ;P

      aha_1980A Offline
      aha_1980A Offline
      aha_1980
      Lifetime Qt Champion
      wrote on last edited by
      #13

      @kshegunov It doesn't - But in C it's the only possibility ;)

      Qt has to stay free or it will die.

      1 Reply Last reply
      0
      • aha_1980A aha_1980

        @JonB

        I don't understand. The typedef/macro is a single one for the type of the table elements, not the type(s) of the functions (which could vary) you put in it? So if you have one "the real table" I don't see why you want 20 typedefs?

        The real table looks like this:

        typedef struct Table {
          bool init(void *);
          bool setParam1(void *, bool param);
          bool param1(void *);
          bool setParam2(void *, bool param);
          bool param2(void *);
          bool write(void *, uint32_t value);
          uint32_t read(void *, bool *ok);
         // ...
        } Table;
        

        So you need to have typedefs for each function prototype. Some might be reuseable, but probably it's better to have one for each row.

        Since presumably you have just one table initialisation in one

        No, I have a handful implementations of that.

        @kshegunov idea of having a macro to create all the tables sounds great, I'll need to try that.

        Thanks for your help

        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by JonB
        #14

        @aha_1980 said in Fixing `-Wincompatible-pointer-types` compiler warning:

        The real table looks like this:

        Yes, sorry, I edited my earlier post, I quite misunderstood and thought you had an array of function pointers to which you wanted to assign.

        But now there is something odd in your case. Since you have

        The real table looks like this:

        typedef struct Table {
          bool init(void *);
          bool setParam1(void *, bool param);
        

        that implies you are writing out exactly the required signature for each function pointer in the struct. In which case, why don't they match correctly against the functions you are assigning to them, then you wouldn't need casts...? That is why I was thinking of the array-of-function-pointers situation, where you do have a problem with one array element type and mutiple different function types to assign.

        aha_1980A 1 Reply Last reply
        0
        • JonBJ JonB

          @aha_1980 said in Fixing `-Wincompatible-pointer-types` compiler warning:

          The real table looks like this:

          Yes, sorry, I edited my earlier post, I quite misunderstood and thought you had an array of function pointers to which you wanted to assign.

          But now there is something odd in your case. Since you have

          The real table looks like this:

          typedef struct Table {
            bool init(void *);
            bool setParam1(void *, bool param);
          

          that implies you are writing out exactly the required signature for each function pointer in the struct. In which case, why don't they match correctly against the functions you are assigning to them, then you wouldn't need casts...? That is why I was thinking of the array-of-function-pointers situation, where you do have a problem with one array element type and mutiple different function types to assign.

          aha_1980A Offline
          aha_1980A Offline
          aha_1980
          Lifetime Qt Champion
          wrote on last edited by
          #15

          @JonB

          As @kshegunov already wrote, the first pointer, the void * is specialized for each implementation struct - think of inheritance.

          So the "base class" has void * and the implementations have Foo * resp. Bar *.

          Nothing wrong with that, just that the compiler warns at this point (which is a bit pointless imho, as ever pointer is compatible to void *, but ok.

          Regards

          Qt has to stay free or it will die.

          kshegunovK JonBJ 2 Replies Last reply
          0
          • aha_1980A aha_1980

            @JonB

            As @kshegunov already wrote, the first pointer, the void * is specialized for each implementation struct - think of inheritance.

            So the "base class" has void * and the implementations have Foo * resp. Bar *.

            Nothing wrong with that, just that the compiler warns at this point (which is a bit pointless imho, as ever pointer is compatible to void *, but ok.

            Regards

            kshegunovK Offline
            kshegunovK Offline
            kshegunov
            Moderators
            wrote on last edited by
            #16

            @aha_1980 said in Fixing `-Wincompatible-pointer-types` compiler warning:

            Nothing wrong with that, just that the compiler warns at this point (which is a bit pointless imho, as ever pointer is compatible to void *, but ok.

            Yes, every pointer decays implicitly to void *, but that's not what the compiler whines about. It complains because the function prototypes are different, hence the actual functions may be different, the compiler can't tell out of the box.

            Read and abide by the Qt Code of Conduct

            1 Reply Last reply
            0
            • aha_1980A aha_1980

              @JonB

              As @kshegunov already wrote, the first pointer, the void * is specialized for each implementation struct - think of inheritance.

              So the "base class" has void * and the implementations have Foo * resp. Bar *.

              Nothing wrong with that, just that the compiler warns at this point (which is a bit pointless imho, as ever pointer is compatible to void *, but ok.

              Regards

              JonBJ Offline
              JonBJ Offline
              JonB
              wrote on last edited by
              #17

              @aha_1980 said in Fixing `-Wincompatible-pointer-types` compiler warning:

              So the "base class" has void * and the implementations have Foo * resp. Bar *.

              What I don't get is: if these classes do not share some base class (Foo, Bar, or something else), it's a bit hard to think what you're doing in C++ to either of them as a parameter to a function when all they have in common is they are pointers to something unknown?

              You don't have to answer/justify yourself. I realise you doubtless know what you are doing and have your own reasons. But that's what strikes me.

              kshegunovK 1 Reply Last reply
              0
              • JonBJ JonB

                @aha_1980 said in Fixing `-Wincompatible-pointer-types` compiler warning:

                So the "base class" has void * and the implementations have Foo * resp. Bar *.

                What I don't get is: if these classes do not share some base class (Foo, Bar, or something else), it's a bit hard to think what you're doing in C++ to either of them as a parameter to a function when all they have in common is they are pointers to something unknown?

                You don't have to answer/justify yourself. I realise you doubtless know what you are doing and have your own reasons. But that's what strikes me.

                kshegunovK Offline
                kshegunovK Offline
                kshegunov
                Moderators
                wrote on last edited by
                #18

                @JonB said in Fixing `-Wincompatible-pointer-types` compiler warning:

                What I don't get is: if these classes do not share some base class (Foo, Bar, or something else), it's a bit hard to think what you're doing in C++ to either of them as a parameter to a function when all they have in common is they are pointers to something unknown?

                What is a base class in C?

                Read and abide by the Qt Code of Conduct

                JonBJ 1 Reply Last reply
                1
                • kshegunovK kshegunov

                  @JonB said in Fixing `-Wincompatible-pointer-types` compiler warning:

                  What I don't get is: if these classes do not share some base class (Foo, Bar, or something else), it's a bit hard to think what you're doing in C++ to either of them as a parameter to a function when all they have in common is they are pointers to something unknown?

                  What is a base class in C?

                  JonBJ Offline
                  JonBJ Offline
                  JonB
                  wrote on last edited by JonB
                  #19

                  @kshegunov said in Fixing `-Wincompatible-pointer-types` compiler warning:

                  What is a base class in C?

                  Oh damn! I forgot already this is not C++, sorry... !

                  OK, well, I still wonder what the shared function does being handed pointers to different C structs, when you don't know what struct it is...?

                  kshegunovK 1 Reply Last reply
                  0
                  • JonBJ JonB

                    @kshegunov said in Fixing `-Wincompatible-pointer-types` compiler warning:

                    What is a base class in C?

                    Oh damn! I forgot already this is not C++, sorry... !

                    OK, well, I still wonder what the shared function does being handed pointers to different C structs, when you don't know what struct it is...?

                    kshegunovK Offline
                    kshegunovK Offline
                    kshegunov
                    Moderators
                    wrote on last edited by
                    #20

                    @JonB said in Fixing `-Wincompatible-pointer-types` compiler warning:

                    OK, well, I still wonder what the shared function does being handed pointers to different C structs, when you don't know what struct it is...?

                    Well, as far as I understood the task the point is to allow inheritance support for a language (and a compiler) which doesn't provide it. This entails (if you follow what C++ does) having a static table of methods for each "class". Each "inherited" table then is supposedly referencing the base class' table and further allowing it to be extended. And if you want at the end you can get dynamic polymorphism in. All in all it's not a trivial thing to do, but should be doable with some magic.

                    Read and abide by the Qt Code of Conduct

                    1 Reply Last reply
                    1
                    • fcarneyF Offline
                      fcarneyF Offline
                      fcarney
                      wrote on last edited by
                      #21

                      Makes me wonder if there is a C++ "like" preprocessor that can produce C.

                      C++ is a perfectly valid school of magic.

                      kshegunovK 1 Reply Last reply
                      0
                      • fcarneyF fcarney

                        Makes me wonder if there is a C++ "like" preprocessor that can produce C.

                        kshegunovK Offline
                        kshegunovK Offline
                        kshegunov
                        Moderators
                        wrote on last edited by
                        #22

                        @fcarney said in Fixing `-Wincompatible-pointer-types` compiler warning:

                        Makes me wonder if there is a C++ "like" preprocessor that can produce C.

                        cmake can produce code (even source I think), and of course you can write your own preprocessor if you wish ... :D

                        Read and abide by the Qt Code of Conduct

                        1 Reply Last reply
                        0
                        • fcarneyF Offline
                          fcarneyF Offline
                          fcarney
                          wrote on last edited by
                          #23

                          Apparently there is: https://isocpp.org/wiki/faq/compiler-dependencies#convert-to-c

                          C++ is a perfectly valid school of magic.

                          kshegunovK 1 Reply Last reply
                          1
                          • fcarneyF fcarney

                            Apparently there is: https://isocpp.org/wiki/faq/compiler-dependencies#convert-to-c

                            kshegunovK Offline
                            kshegunovK Offline
                            kshegunov
                            Moderators
                            wrote on last edited by
                            #24

                            @fcarney said in Fixing `-Wincompatible-pointer-types` compiler warning:

                            Apparently there is: https://isocpp.org/wiki/faq/compiler-dependencies#convert-to-c

                            heh, that's an interesting find ... and sort of a funny one ...

                            Read and abide by the Qt Code of Conduct

                            1 Reply Last reply
                            1

                            • Login

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