首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__cdecl参数“.”和__VA_ARGS__

__cdecl参数“.”和__VA_ARGS__
EN

Stack Overflow用户
提问于 2010-08-31 02:50:24
回答 1查看 823关注 0票数 2
代码语言:javascript
复制
#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 */);
}

在我的项目中有许多调用foo函数的代码。

我今天做了一个新的宏观嘘声。我想调用foo函数中的宏。

我该怎么做?

编辑:

当然,我们可以通过调用一些函数(而不是宏)来解决这个问题,比如StringCbVPrintf。

但我找到了一种叫宏的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-31 03:07:59

一个被认为毫无帮助的回答

这个问题没有得到适当的解释。这个答案没有回答提问者心中的问题,而是回答了似乎被问到的问题。意图与现实之间存在着差距。

代码语言:javascript
复制
#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);
}

除了所有的因素外,您还可以调用一个函数或宏,其中包含完成工作所需的参数。由于您没有指定格式应该是什么样的,所以我编写了适合自己的格式字符串--它们可能不是很有用,但谁知道呢。

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

一个被认为更有帮助的答案

鉴于评论中所作的澄清,那么:

代码语言:javascript
复制
#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);
    }
}

但是,要使其工作,底层函数需要知道如何处理va_list。这意味着您通常会得到以下代码,其结构类似于以下内容:

代码语言:javascript
复制
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);
    }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3605717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档