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
Forum Update on Monday, May 27th 2025

Having problems with ellipsis in variadic macro

Scheduled Pinned Locked Moved C++ Gurus
3 Posts 2 Posters 2.5k 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.
  • 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