Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Warning when using qint64 with PRIi64 on 64 bit linux
Qt 6.12 LTS is out! See what's new in the release blog

Warning when using qint64 with PRIi64 on 64 bit linux

Scheduled Pinned Locked Moved Unsolved General and Desktop
17 Posts 3 Posters 9.1k 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.
  • DuBuD DuBu

    @m.sue Yes, I thought so too. But it doesn't! Here's a snippet from inttypes.h:

    # if __WORDSIZE == 64
    #  define __PRI64_PREFIX	"l"
    #  define __PRIPTR_PREFIX	"l"
    # else
    #  define __PRI64_PREFIX	"ll"
    #  define __PRIPTR_PREFIX
    # endif
    # define PRIi64		__PRI64_PREFIX "i"
    

    And the if branch is active (i.e __WORDSIZE == 64 is true).
    So PRIi64 returns "li" on my system. The compiler is the one I already mentioned.

    m.sueM Offline
    m.sueM Offline
    m.sue
    wrote on last edited by
    #6

    Hi @DuBu

    It works if you use int64_t instead of qint64.

    -Michael.

    DuBuD 1 Reply Last reply
    0
    • m.sueM m.sue

      Hi @DuBu

      It works if you use int64_t instead of qint64.

      -Michael.

      DuBuD Offline
      DuBuD Offline
      DuBu
      wrote on last edited by
      #7

      @m.sue I can't change that, it's code from Qt (i.e QElapsedTimer::elapsed()).

      m.sueM 1 Reply Last reply
      0
      • DuBuD DuBu

        @m.sue I can't change that, it's code from Qt (i.e QElapsedTimer::elapsed()).

        m.sueM Offline
        m.sueM Offline
        m.sue
        wrote on last edited by
        #8

        Hi @DuBu

        You could probably cast it to int64_t. It is ugly, though.

        -Michael.

        1 Reply Last reply
        0
        • jsulmJ jsulm

          @DuBu Use ll instead of li, see http://www.cplusplus.com/reference/cstdio/printf/

          DuBuD Offline
          DuBuD Offline
          DuBu
          wrote on last edited by
          #9

          @jsulm Yes, but I want to use the PRI macros.

          1 Reply Last reply
          0
          • DuBuD Offline
            DuBuD Offline
            DuBu
            wrote on last edited by
            #10

            I wonder what is wrong, the qint64 which is actually a long long int or the PRIi64 macro which is actually a "li"?

            m.sueM 1 Reply Last reply
            0
            • DuBuD DuBu

              I wonder what is wrong, the qint64 which is actually a long long int or the PRIi64 macro which is actually a "li"?

              m.sueM Offline
              m.sueM Offline
              m.sue
              wrote on last edited by m.sue
              #11

              Hi @DuBu

              PRIi64 together with int64_t is "lli", together with qint64 it is "li". The PRI macros probably do not know what to do about qint64. Maybe it's a compiler bug.

              -Michael.

              1 Reply Last reply
              0
              • DuBuD Offline
                DuBuD Offline
                DuBu
                wrote on last edited by
                #12

                Ok, thanks guys! I ended up by using PRIi64 and casting qint64 to int64_t when necessary.

                m.sueM 1 Reply Last reply
                0
                • DuBuD DuBu

                  Ok, thanks guys! I ended up by using PRIi64 and casting qint64 to int64_t when necessary.

                  m.sueM Offline
                  m.sueM Offline
                  m.sue
                  wrote on last edited by
                  #13

                  Hi @DuBu

                  Qt could fix it by defining typedef int64_t qint64; instead of typedef long long qint64; on Linux. But, of course, there could be some side effects of that change that I do not see. Maybe some supported compiler does not yet have the int64_t type.

                  -Michael.

                  jsulmJ 1 Reply Last reply
                  0
                  • m.sueM m.sue

                    Hi @DuBu

                    Qt could fix it by defining typedef int64_t qint64; instead of typedef long long qint64; on Linux. But, of course, there could be some side effects of that change that I do not see. Maybe some supported compiler does not yet have the int64_t type.

                    -Michael.

                    jsulmJ Offline
                    jsulmJ Offline
                    jsulm
                    Lifetime Qt Champion
                    wrote on last edited by
                    #14

                    @m.sue long long is not necessarily always 64 bit. The length of integral types in C/C++ isn't specified exactly. The only thing specified is:

                    char <= short <= int <= long int <= long long
                    

                    The exact size of each type depends on platform and compiler.

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

                    m.sueM 1 Reply Last reply
                    0
                    • jsulmJ jsulm

                      @m.sue long long is not necessarily always 64 bit. The length of integral types in C/C++ isn't specified exactly. The only thing specified is:

                      char <= short <= int <= long int <= long long
                      

                      The exact size of each type depends on platform and compiler.

                      m.sueM Offline
                      m.sueM Offline
                      m.sue
                      wrote on last edited by
                      #15

                      Hi @jsulm

                      Ok, but as int64_t is guarantueed to be 64-bit, it is not guarantueed to be defined for every compiler. So it's no good choice for qint64.

                      Nevertheless Qt should find a way to use it without warnings in printf with the new PRI macros, They are just about invented to use with long longs that are or are not 64-bit depending on the compiler/machine.

                      -Michael.

                      jsulmJ 1 Reply Last reply
                      0
                      • m.sueM m.sue

                        Hi @jsulm

                        Ok, but as int64_t is guarantueed to be 64-bit, it is not guarantueed to be defined for every compiler. So it's no good choice for qint64.

                        Nevertheless Qt should find a way to use it without warnings in printf with the new PRI macros, They are just about invented to use with long longs that are or are not 64-bit depending on the compiler/machine.

                        -Michael.

                        jsulmJ Offline
                        jsulmJ Offline
                        jsulm
                        Lifetime Qt Champion
                        wrote on last edited by jsulm
                        #16

                        @m.sue Well, qint64 is guaranteed to be 64 bit, so you cannot use long long to typedef it.
                        int64_t is defined in C++11 and as Qt requires C++11 since quite some time it is perfectly valid to use int64_t in my opinion.
                        And why use printf in C++ at all?

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

                        DuBuD 1 Reply Last reply
                        0
                        • jsulmJ jsulm

                          @m.sue Well, qint64 is guaranteed to be 64 bit, so you cannot use long long to typedef it.
                          int64_t is defined in C++11 and as Qt requires C++11 since quite some time it is perfectly valid to use int64_t in my opinion.
                          And why use printf in C++ at all?

                          DuBuD Offline
                          DuBuD Offline
                          DuBu
                          wrote on last edited by DuBu
                          #17

                          @jsulm Yes, to use int64_t is perfectly valid. So Qt should use it in their own classes.
                          Why use printf in C++? Cause it sits deep down in a C library we want to use in C++ as well. And also: why not?

                          1 Reply Last reply
                          0

                          • Login

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