代码之家  ›  专栏  ›  技术社区  ›  greywolf82

宏变量参数

  •  1
  • greywolf82  · 技术社区  · 6 年前

    我有这个代码:

    std::string format(const char *fmt, ...);
    
    #define DEBUG(HANDLER, LEVEL, ...) LOG##LEVEL(HANDLER, format(__VA_ARGS__))
    

    它在我使用时起作用:

    DEBUG(handler, DEBUG, "var is %d\n", 15);
    

    但当我使用时它不起作用:

    DEBUG(handler, DEBUG, "test");
    

    如何检查是否只有一个或多个参数?
    我需要使用 C++ 98 解决方案。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Duck Dodgers    6 年前

    所以,我看了你的问题,看了你的代码,我意识到这可能是 臭名昭著的XY问题 .

    尽管您说,您希望计算传递给宏的参数的数目, 您要做的是编写调试消息,这些消息没有任何其他参数,除了一个文本字符串,该字符串按照您在示例中所示的方式声明调试消息。

    DEBUG(handler, DEBUG, "test");

    但这当然是可能的。为了测试它,我写了下面的代码。

    std::string format(const char* fmt, ...) {
        char buffer[256];
        std::cout << __FUNCTION__ << std::endl;
        va_list argList;
        va_start(argList, fmt);
        vsprintf(buffer, fmt, argList);
        va_end(argList);
        return std::string(buffer);
    }
    
    #define TRC(...) {\
        std::cout << "MACRO!" << std::endl; \
        std::cout << format(__VA_ARGS__);\
    }
    
    int main()
    {
        std::cout << "Hello World!" << std::endl;
        const char *t = "b";
        TRC("[%s] bla bla [%d]\n", t, 9);
        TRC("test");
        return 0;
    }
    

    它产生输出,

    世界你好!
    宏!
    格式
    [B] BLA BLA〔9〕
    宏!
    格式
    测试

    正如我在前面对你问题的评论中提到的,我已经 C++03 编译器,但这也适用于C++ 98。

    问题:

    “我如何检查是否只有一个或多个参数?”

    变量宏本身没有问题,无论您有一个或多个参数。

    但是如果你真的还想计算传入的参数的数目,我不知道 C++ 03 或者更早的时候。

        2
  •  1
  •   Michael Veksler    6 年前

    自从 __VA__ARGS__ 在您的其他C++ 98编译器上可用(尽管是一个 C++11 feature )也有可能 __VA_OPT__ 作为扩展:

    你应该使用 __VA_OPT__(something) (这是一个C++ 20的特性),只有在至少有一个参数时才出现逗号:

    #define DEBUG(HANDLER, LEVEL, ...) LOG##LEVEL(HANDLER __VA_OPT__( format(__VA_ARGS__)))
    

    或者类似的东西。