C++ 如何将NULL传递给va_list函数参数?

C++ 如何将NULL传递给va_list函数参数?,c++,android-ndk,g++,variadic-functions,C++,Android Ndk,G++,Variadic Functions,我想将NULL传递给以下函数的第四个参数: bool CCMenuItemToggle::initWithTarget(CCObject* target, SEL_MenuHandler selector, CCMenuItem* item, **va_list args**); 像这样: CCMenuItemToggle::initWithTarget(this, menu_selector(GOSound::toggleButtonCallback), NULL, NULL); 当我在X

我想将NULL传递给以下函数的第四个参数:

bool CCMenuItemToggle::initWithTarget(CCObject* target, SEL_MenuHandler selector, CCMenuItem* item, **va_list args**);
像这样:

CCMenuItemToggle::initWithTarget(this, menu_selector(GOSound::toggleButtonCallback), NULL, NULL);
当我在XCode(clang3.1)中构建它时,它还可以。但当我将代码移植到android ndk(g++4.7)时,它无法编译:

从“int”到“va_list”(又名“内置va_list”)没有可行的转换


我应该如何处理它呢?

如果您只使用一个空的
va_列表,而不是空的
,我假设您的代码会工作

CCMenuItemToggle::initWithTarget( this, menu_selector(GOSound::toggleButtonCallback)
                                , NULL, va_list() );
编辑: 也许这个替代解决方案适用于这两种编译器

va_list empty_va_list = va_list();
CCMenuItemToggle::initWithTarget( this, menu_selector(GOSound::toggleButtonCallback)
                                , NULL, empty_va_list );

我看到这个问题得到了回答,但它不是标准的。下面的代码将通过Visual Studio中的运行时错误执行;但是,它在g++中运行良好

    va_list empty_va_list;
CCMenuItemToggle::initWithTarget( this, menu_selector(GOSound::toggleButtonCallback), NULL, empty_va_list );
更好的解决方案是创建一对助手函数,构造一个空的va_列表

va_list CCMenuItemToggle::createEmptyVa_list()
{
   return doCreateEmptyVa_list(0);
}

va_list CCMenuItemToggle::doCreateEmptyVa_list(int i,...)
{
    va_list vl;
    va_start(vl,i);
    return vl;
}
将doCreateEmptyVa_列表设为私有,然后在调用函数调用时

CCMenuItemToggle::initWithTarget( this, menu_selector(GOSound::toggleButtonCallback), NULL, CreateEmptyVa_list() );

不能将
NULL
作为函数的第四个参数传递。该函数需要一个
va_list
参数
NULL
在一般情况下不是
va_列表
对象的有效初始值设定项。所以,你的问题的答案是:这是不可能的


您应该如何处理它取决于您正在尝试做什么。

我刚刚注意到我用ndk(clang3.1)测试了您的解决方案。当我切换回ndk(g++4.7)时,它会报告错误:
内部编译器错误:在cp/init.c:280处的内部编译错误:我不认为我对此负责。答案仍然正确。编译器坏了。在调用之前声明一个变量并传递该变量可能会有所帮助。请参阅上面的编辑。由于传递未初始化的变量,这可能是技术上未定义的行为?@M.M我添加了一个初始化。GCC 6.2中的第二个代码段:错误:在“va_list”之前应该有表达式。“您正在尝试做的”是:调用函数。其他参数的值决定函数永远不会使用
va_list
参数
vl
在某种意义上是“悬空的”。“在使用va_start初始化va_list对象的函数返回之前,应调用va_end宏。”