gpt4 book ai didi

c - __cdecl 参数 "..."和 __VA_ARGS__

转载 作者:太空宇宙 更新时间:2023-11-03 23:56:50 24 4
gpt4 key购买 nike

#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。
但我正在寻找调用宏的方法。

最佳答案

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

问题没有得到正确解释。这个答案并没有回答提问者心里想的问题,但是确实回答了好像要问的问题。意图与现实之间存在差距。

#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()


被认为更有帮助的答案

鉴于评论中的说明,那么:

#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。这意味着您通常会得到以下代码,其结构类似于以下内容:

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”代替省略号。省略号代码被标准化为四或五行 - 或多或少如图所示;它使用 va_start 创建并初始化 va_list,调用 v 函数,并在执行 va_end 后返回结果。

关于c - __cdecl 参数 "..."和 __VA_ARGS__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3605717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com