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. Having problems with ellipsis in variadic macro
Qt 6.11 is out! See what's new in the release blog

Having problems with ellipsis in variadic macro

Scheduled Pinned Locked Moved C++ Gurus
3 Posts 2 Posters 2.9k 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.
  • T3STYT Offline
    T3STYT Offline
    T3STY
    wrote on last edited by
    #1

    I'm trying to make a ripoff of the qDebug function to print a custom-made message output. The idea looks like this:
    @#define DBG(caller, msg_str, ... ) qDebug("equalizer::%s: %s", caller, msg_str, varList )

    #define MSG_ADD_SUCCESS "[0] new value: %d"
    #define MSG_ADD_NULLPTR "[1] error: nullptr"

    #define MSG_REM_SUCCESS "[0] value successfully removed at %d"
    #define MSG_REM_EMPTY "[2] error: Unable to remove value at %d: empty list"
    #define MSG_REM_OOR "[3] error: out of range [%d : %d]"@

    When I compile the code using the definition above I get a lot of: "warning: too many arguments for format [-Wformat-extra-args]" and "expected primary-expression before ')' token" errors,
    There's something terribly wrong in my idea, which is what I came here for. I'm looking for a solution that would allow me to use variadic macros with the same macro structure that I wrote above because I may often need to pass some more parameters, if needed, to qDebug. For example I might want to call it like this:
    @DBG("myfunction", MSG_REM_OOR, 0, 100);@
    which should output:
    @"equalizer::myfunction: [3] error: out of range [0 : 100]"@
    I don't want to write a variadic function to ripoff the qDebug one because that would be totally useless. I could just use qDebug alone, but I would have to write many times the same string format and I want to avoid that.

    Any suggestions?

    p.s. I'm using gcc 4.8.2 compiler (from mingw32/64) on Windows 7, Qt 5.2.0.

    1 Reply Last reply
    0
    • P Offline
      P Offline
      prady_80
      wrote on last edited by
      #2

      May be the ## helps... http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

      1 Reply Last reply
      0
      • T3STYT Offline
        T3STYT Offline
        T3STY
        wrote on last edited by
        #3

        Useless message removed, please see the edit below

        EDIT
        Forget it all! I got it working, and with no 'ugly' solution, which is:
        @#define DBG(caller, msg_str, args...) qDebug("equalizer::%s: " msg_str, caller, ##args)@
        I concatenated a default string format with msg_str using a simple space and then passed all the arguments. Yep... as simple solution as that... dumb-proof, yet, I missed it at first.
        What I wanted was to concatenate a default message format string with another string msg_str; instead, I was passing msg_str as an argument. So even if msg_str specified more arguments they were interpreted as string literals, not as function arguments, because msg_str was an argument itself - that's why I was getting the “warning: too many arguments for format [-Wformat-extra-args]” warning.

        to prady_80: the ## was a nice suggestion, thanks! I need it for calls wich take no arguments, like MSG_ADD_NULLPTR. This is the solution to the “expected primary-expression before ‘)’ token” error.

        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