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. Warning when using qint64 with PRIi64 on 64 bit linux

Warning when using qint64 with PRIi64 on 64 bit linux

Scheduled Pinned Locked Moved Unsolved General and Desktop
17 Posts 3 Posters 4.7k Views
  • 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 Offline
    DuBuD Offline
    DuBu
    wrote on last edited by
    #1

    Hi,

    when I try to print a qint64 with printf and the format specifier PRIi64 on a 64 bit linux I get the following warning:

    warning: format ‘%li’ expects argument of type ‘long int’, but argument 4 has type ‘qint64 {aka long long int}’ [-Wformat=]                                                                                               
    
    g++ --version:
    g++ (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609
    

    How can I print without warnings?

    Thanks in advance!

    m.sueM jsulmJ 2 Replies Last reply
    0
    • DuBuD DuBu

      Hi,

      when I try to print a qint64 with printf and the format specifier PRIi64 on a 64 bit linux I get the following warning:

      warning: format ‘%li’ expects argument of type ‘long int’, but argument 4 has type ‘qint64 {aka long long int}’ [-Wformat=]                                                                                               
      
      g++ --version:
      g++ (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609
      

      How can I print without warnings?

      Thanks in advance!

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

      Hi @DuBu

      PRIi64 should return "lli" on a 64-bit system. So maybe you use a 32-bit system or (cross-)compiler.

      -Michael.

      DuBuD 1 Reply Last reply
      0
      • DuBuD DuBu

        Hi,

        when I try to print a qint64 with printf and the format specifier PRIi64 on a 64 bit linux I get the following warning:

        warning: format ‘%li’ expects argument of type ‘long int’, but argument 4 has type ‘qint64 {aka long long int}’ [-Wformat=]                                                                                               
        
        g++ --version:
        g++ (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609
        

        How can I print without warnings?

        Thanks in advance!

        jsulmJ Online
        jsulmJ Online
        jsulm
        Lifetime Qt Champion
        wrote on last edited by
        #3

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

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

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

          Hi @DuBu

          PRIi64 should return "lli" on a 64-bit system. So maybe you use a 32-bit system or (cross-)compiler.

          -Michael.

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

          @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 2 Replies Last reply
          0
          • 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 m.sue
            #5

            Hi @DuBu

            I have the same compiler and the same code as you in /usr/include/inttypes.h. But PRIi64 returns "lli". No idea what could be the difference :-/

            Ah I just tested: I get the same error as you in main.cpp but in some sub-dll where I use all my PRI* strings everything works fine. Interesting.

            -Michael.

            1 Reply Last reply
            0
            • 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 Online
                              jsulmJ Online
                              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 Online
                                  jsulmJ Online
                                  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 Extensions
                                    • Unsolved