我的va_start / va_end宏工作错了

时间:2015-05-07 22:52:49

标签: c++ function macros

大家;

请帮助我:

#include "fstream"
#include "iostream"
#include "string"
#include "stdarg.h"
using namespace std;

void f(char a,...)
{
    cout<<a;
    va_list list;
    va_start(list,a);
    cout<<va_arg(list,char)<<" ";
    va_end(list);
};

int main()
{
    f('a','b','c','d');
    system("pause >> void");
    return 0;
}

必须提供此结果

a b c d

但它仅仅支持

a b

我做错了什么?

1 个答案:

答案 0 :(得分:1)

两个问题:

至少在某些编译器上,将char传递给varargs函数会被提升为int。我自己忘记了这个,直到我敲出了一些测试代码并且编译器唠叨了。这意味着您的8位刚刚变为32位或64位。这可能会导致非常好的 Kaboom!

cout<<va_arg(list,char)<<" ";

每次调用va_arg都会返回一个变量,即字符&#39; b&#39;在这种情况下。要获得&#39; c&#39;你必须再打电话给它。等...

这会让你知道何时停止调用va_arg这个有趣的问题。

这是一个廉价的黑客:

#include "fstream"
#include "iostream"
#include "string"
#include "stdarg.h"
using namespace std;

void f(char a,...)
{
    cout<<a;
    va_list list;
    va_start(list,a);
    char ch = (char)va_arg(list,int);
    while (ch != '\0') // stopping on null
    {
        cout << " " << ch; // cout << a didn't have a space appended so I 
                           // reversed the placement here
        ch = (char)va_arg(list,int);
    }
    va_end(list);
};

int main()
{
    f('a','b','c','d', '\0');  // note the added null. 
    cout << endl;

    system("pause >> void"); // better ways to do this cin >> junk, for one
    return 0;
}