gpt4 book ai didi

c++ - 动态创建 va_list

转载 作者:IT老高 更新时间:2023-10-28 22:21:18 24 4
gpt4 key购买 nike

我有一个功能

void foo(int cnt, va_list ap);

我需要使用它,但要求非常严格,va_list 的数量会有所不同,并且会在运行时发生变化。我想做的是:

创建一个 va_list(需要 char*)表单

QList<Contact*>

其中 Contact 是已定义的类

class Contact
{
public:
QString getName();
private:
QString m_name;

};

我想在循环中填充 va_list 例如:

for (int idx = 0; idx<contacts.count(); idx++)
{
contacts.at(idx)->getName(); // this i would like to pass to va_list

}

有人知道我该怎么做吗?

最佳答案

您想要做的是模拟调用堆栈,以便您可以将构造的 va_list 传递给 foo()。这是特定于编译器的(并且警告,即使是 32 位和 64 位编译器之间也存在差异)。以下代码仅用于娱乐目的!!!,因为(如果它甚至可以在您的系统上运行)它很容易损坏。有了它,我使用了一个平面内存缓冲区,并用一个计数和一堆字符串填充它。你可以用指向你的字符串的指针来填充它并把它们传递下来。

它似乎确实适用于我的系统,Windows 7 w/Visual Studio 2008,仅适用于 32 位应用程序。

* 错误的想法代码如下!!! *

#define PSEUDOSTACKSIZE ( sizeof(int) + 999 * sizeof(const char*) )
#pragma pack( push,1 )
union PSEUDOSTACK
{
int count;
char data[PSEUDOSTACKSIZE];
};
#pragma pack( pop )

void foo( int count, va_list args )
{
for ( int i = 0; i < count; i++ )
{
char *s = va_arg( args, char* );
printf( "%s\n", s);
}
}

void bar( PSEUDOSTACK data, ... )
{
va_list args;
va_start(args, data.count);
foo( data.count, args);
va_end(args);
}
// And later on, the actual test case code.
PSEUDOSTACK barData;
barData.count = 999;
char *p = barData.data + sizeof(int);
for ( int i = 0; i < 999; i++, p += sizeof(char*) )
{
*reinterpret_cast<char**>(p) = "ThisIsABadIdea";
}
bar( barData );

我现在会因为想到这样的想法而羞愧地低下头。

关于c++ - 动态创建 va_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3351056/

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