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. Syntax Error with Q_ASSERT
Forum Updated to NodeBB v4.3 + New Features

Syntax Error with Q_ASSERT

Scheduled Pinned Locked Moved Solved C++ Gurus
25 Posts 5 Posters 9.3k Views 5 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.
  • ? Offline
    ? Offline
    A Former User
    wrote on last edited by
    #13

    I just came up with something that looks like a solution for this to me. What do guys think?

    #if !defined(MY_ASSERT)
    #  ifndef QT_NO_DEBUG
    #    define MY_ASSERT_FIRST_ARGUMENT(A, ...) A
    #    define MY_ASSERT(...) ((!MY_ASSERT_FIRST_ARGUMENT(__VA_ARGS__)) ? qt_assert(#__VA_ARGS__,__FILE__,__LINE__) : qt_noop())
    #  else
    #    define MY_ASSERT(...) qt_noop()
    #  endif
    #endif
    
    mrjjM 1 Reply Last reply
    0
    • ? A Former User

      I just came up with something that looks like a solution for this to me. What do guys think?

      #if !defined(MY_ASSERT)
      #  ifndef QT_NO_DEBUG
      #    define MY_ASSERT_FIRST_ARGUMENT(A, ...) A
      #    define MY_ASSERT(...) ((!MY_ASSERT_FIRST_ARGUMENT(__VA_ARGS__)) ? qt_assert(#__VA_ARGS__,__FILE__,__LINE__) : qt_noop())
      #  else
      #    define MY_ASSERT(...) qt_noop()
      #  endif
      #endif
      
      mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #14

      @Wieland
      where is the docs? ;)
      Looks cool. its cryptic enough that it might actually work :)

      K 1 Reply Last reply
      0
      • mrjjM mrjj

        @Wieland
        where is the docs? ;)
        Looks cool. its cryptic enough that it might actually work :)

        K Offline
        K Offline
        koahnig
        wrote on last edited by
        #15

        @mrjj said in Syntax Error with Q_ASSERT:

        Looks cool. its cryptic enough that it might actually work :)

        :D :D

        Vote the answer(s) that helped you to solve your issue(s)

        1 Reply Last reply
        1
        • ? Offline
          ? Offline
          A Former User
          wrote on last edited by A Former User
          #16

          It's almost the same as the current implementation of Q_ASSERT, just with a variadic macro. So it's C++11 only.

          1 Reply Last reply
          0
          • Chris KawaC Offline
            Chris KawaC Offline
            Chris Kawa
            Lifetime Qt Champion
            wrote on last edited by Chris Kawa
            #17

            @mrjj good one :)
            @Wieland Could you explain how it is suppose to work? From what I can decrypt it just checks the first argument passed, so for your original exampleMY_ASSERT(std::is_same<int, int>::value); it would expand to something like ((!std::is_same<int) ? ... which doesn't make much sense? Or am I missing something?

            Btw. I get compiler errors for this:
            with gcc: in definition of macro MY_ASSERT_FIRST_ARGUMENT wrong number of template arguments (1, should be 2)
            with clang: error: expected > MY_ASSERT(std::is_same<int, int>::value);
            it compiles in VS2015 U3 although their macro expansion is broken to bits so I wouldn't trust it does what it should.

            ? 2 Replies Last reply
            1
            • Chris KawaC Chris Kawa

              @mrjj good one :)
              @Wieland Could you explain how it is suppose to work? From what I can decrypt it just checks the first argument passed, so for your original exampleMY_ASSERT(std::is_same<int, int>::value); it would expand to something like ((!std::is_same<int) ? ... which doesn't make much sense? Or am I missing something?

              Btw. I get compiler errors for this:
              with gcc: in definition of macro MY_ASSERT_FIRST_ARGUMENT wrong number of template arguments (1, should be 2)
              with clang: error: expected > MY_ASSERT(std::is_same<int, int>::value);
              it compiles in VS2015 U3 although their macro expansion is broken to bits so I wouldn't trust it does what it should.

              ? Offline
              ? Offline
              A Former User
              wrote on last edited by
              #18

              @Chris-Kawa Damn, I only tested it with MSVC and it works there :-(

              1 Reply Last reply
              1
              • Chris KawaC Chris Kawa

                @mrjj good one :)
                @Wieland Could you explain how it is suppose to work? From what I can decrypt it just checks the first argument passed, so for your original exampleMY_ASSERT(std::is_same<int, int>::value); it would expand to something like ((!std::is_same<int) ? ... which doesn't make much sense? Or am I missing something?

                Btw. I get compiler errors for this:
                with gcc: in definition of macro MY_ASSERT_FIRST_ARGUMENT wrong number of template arguments (1, should be 2)
                with clang: error: expected > MY_ASSERT(std::is_same<int, int>::value);
                it compiles in VS2015 U3 although their macro expansion is broken to bits so I wouldn't trust it does what it should.

                ? Offline
                ? Offline
                A Former User
                wrote on last edited by A Former User
                #19

                @Chris-Kawa My idea hope was that the preprocessor would be smarter when I confront it with a variadic macro.

                1 Reply Last reply
                0
                • Chris KawaC Offline
                  Chris KawaC Offline
                  Chris Kawa
                  Lifetime Qt Champion
                  wrote on last edited by
                  #20

                  @Wieland I don't think it works. It just compiles ;)
                  Well you could use something simpler:

                  define MY_ASSERT(...) (!(__VA_ARGS__) ? qt_assert(#__VA_ARGS__,__FILE__,__LINE__) : qt_noop())
                  

                  and that should be ok, but it has the same drawback I described earlier - it changes the expression it tests by adding extra () around it. Admittedly it's not a big deal and it should work as expected most of the time.

                  ? 1 Reply Last reply
                  0
                  • Chris KawaC Chris Kawa

                    @Wieland I don't think it works. It just compiles ;)
                    Well you could use something simpler:

                    define MY_ASSERT(...) (!(__VA_ARGS__) ? qt_assert(#__VA_ARGS__,__FILE__,__LINE__) : qt_noop())
                    

                    and that should be ok, but it has the same drawback I described earlier - it changes the expression it tests by adding extra () around it. Admittedly it's not a big deal and it should work as expected most of the time.

                    ? Offline
                    ? Offline
                    A Former User
                    wrote on last edited by A Former User
                    #21

                    @Chris-Kawa Yes it works; funny that it doesn't work for you. Who knows why..

                    1 Reply Last reply
                    0
                    • Chris KawaC Offline
                      Chris KawaC Offline
                      Chris Kawa
                      Lifetime Qt Champion
                      wrote on last edited by
                      #22

                      @Wieland Maybe I messed up something. http://ideone.com/XKJUnV

                      ? 1 Reply Last reply
                      0
                      • Chris KawaC Chris Kawa

                        @Wieland Maybe I messed up something. http://ideone.com/XKJUnV

                        ? Offline
                        ? Offline
                        A Former User
                        wrote on last edited by A Former User
                        #23

                        @Chris-Kawa Ha! Just found out that #define FIRST(A, ...) A doesn't work as expected (with MSVC): It doesn't give us the first argument only, instead it just gives all arguments (like __VA_ARGS__). Maybe I'm wrong here again, but that looks like a bug in MSVC to me and it also explains why the code works.

                        Edit: Maybe it's really a bug in VC's preprocessor, at least someone on SO says so. And the workaround he presents actually seems to fix it, so now my code doesn't compile with MSVC anymore.

                        1 Reply Last reply
                        1
                        • ? Offline
                          ? Offline
                          A Former User
                          wrote on last edited by
                          #24

                          Thanks everyone for watching me stumbling around like a clown :)

                          mrjjM 1 Reply Last reply
                          2
                          • ? A Former User

                            Thanks everyone for watching me stumbling around like a clown :)

                            mrjjM Offline
                            mrjjM Offline
                            mrjj
                            Lifetime Qt Champion
                            wrote on last edited by
                            #25

                            @Wieland
                            Well to be fair, fooling around with Variadic Macros takes more balls than entertaining
                            clueless children - so it was educational to see that even in 2016, you cannot trust the preprocessor
                            to work the same across compilers. :)

                            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