__cdecl参数“…”&引用;和uu VA_uargs__

__cdecl参数“…”&引用;和uu VA_uargs__,c,variadic-functions,C,Variadic Functions,在我的项目中有许多调用foo函数的代码。 我今天做了一个新的宏boo。我想调用foo函数中的宏 我该怎么做 编辑: 当然,我们可以通过调用一些函数(而不是宏)来解决这个问题,比如StringCbVPrintf。 但我正在寻找一种方法来调用宏。一个被认为没有帮助的答案 这个问题没有得到适当的解释。这个答案并没有回答提问者心中的问题,而是回答了似乎要问的问题。意图和现实之间存在差距 #define boo(fmt, ...) SomethingToDo(fmt, __VA_ARGS__) voi

在我的项目中有许多调用foo函数的代码。
我今天做了一个新的宏boo。我想调用foo函数中的宏

我该怎么做

编辑:
当然,我们可以通过调用一些函数(而不是宏)来解决这个问题,比如StringCbVPrintf。
但我正在寻找一种方法来调用宏。

一个被认为没有帮助的答案 这个问题没有得到适当的解释。这个答案并没有回答提问者心中的问题,而是回答了似乎要问的问题。意图和现实之间存在差距

#define boo(fmt, ...)   SomethingToDo(fmt, __VA_ARGS__)
void foo(PCSTR fmt, ...)
{
    // some other codes
    if(condition1)
    {
        va_list marker;
        va_start(maker, fmt);
        // Do something.
        va_end(marker);
    }

    if(somecondition)
        boo(fmt, /* I want to put the foo's va_arguments here */);
}
除了开玩笑之外,您还可以使用完成工作所需的参数调用函数或宏。因为您没有指定格式应该是什么样的,所以我已经编写了适合自己的格式字符串-它们可能不是很有用,但谁知道呢

无论如何,关键的一点是,您可以使用不同的参数列表调用宏
boo()
,这些参数将被传递到
SomethingToDo()


一个被认为更有帮助的答案 根据评论中的澄清,然后:

#define boo(fmt, ...) SomethingToDo(fmt, __VA_ARGS__) // semi-colon removed!
void foo(PCSTR fmt, ...)
{
    // some other codes

    // I want to call boo with VarArgs.
    if (somecondition)
        boo(fmt, arg1, arg2);
    if (anothercondition)
        boo("%x %y %z", e1, e2, e3);
    if (yetanothercondition)
        boo("&T99 P37 T22 9%X  ZZQ", x1, y2, z3, a4, b9, c7, q99);
}
但是,要使其工作,底层函数需要知道如何处理
va_列表
。这意味着您通常会得到以下代码,其结构类似于:

#define boo(fmt, ...)   SomethingToDo(fmt, __VA_ARGS__)
void foo(PCSTR fmt, ...)
{
    va_list args;

    // I want to call boo with VarArgs.
    if (somecondition)
    {
        va_start(args, fmt);
        boo(fmt, args);
        va_end(args);
    }
}

这是使用变量参数的代码的“标准模式”。您可以在标准C中看到它:
printf()
vprintf()
snprintf()
vsnprintf()
fprintf()
vfprintf()
;等等函数的一个版本在参数列表中有省略号;另一个版本以字母“v”作为前缀,并使用“va_列表”代替省略号。省略号标准化为四行或五行,大致如图所示;它使用va_start创建并初始化va_列表,调用v函数,并在执行va_end后返回结果。

Edited tag to C。。。在C++中,你不应该滥用宏处理器。宏不应该以分号结尾。可能想修一下,已经修好了。谢谢。我想把foo的变量参数(它的意思是“…”)放到我的boo宏中。我查了fa·ce·utile(f-sshs)adj。开玩笑的;幽默的,幽默的:好笑的评论。你应该得到58K。我学到了很多。谢谢
void vSomethingToDo(const char *fmt, va_list args)
{
    ...code using vfprintf() or whatever...
}

void SomethingToDo(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    vSomethingToDo(fmt, args);
    va_end(args);
}

#define vboo(fmt, args) vSomethingToDo(fmt, args)
#define boo(fmt, ...)    SomethingToDo(fmt, __VA_ARGS__)

void foo(PCSTR fmt, ...)
{
    ...other code...
    if (somecondition)
    {
        va_list args;
        va_start(args, fmt);
        vboo(fmt, args);
        va_end(args);
    }
}