变量函数参数

时间:2016-02-10 11:59:55

标签: c++ linux parameters

我的打印功能运行良好,今天我想在此函数中添加另一个参数,所以我将其添加为第一个参数,但所有带有额外参数的消息如"%d"都显示错误地,我搜索了几个小时试图理解为什么但没有任何用处,我做错了什么?

我试图添加" __ cdecl",它也没有用。

如果我删除了第一个参数" int i",那么一切正常。 它在OS X 10.11上运行,Xcode 7.1.2是一个控制台应用程序。

void print(int i, const char* format_str, ...) {
    // get parameters
    va_list argptr;
    char buffer[1024] = {0};
    va_start(argptr, format_str);
    vsprintf(buffer, format_str, argptr);
    // log on screen
    std::cout << (char*)buffer << std::endl;
    va_end(argptr);
}

void call_print(const char* format_str, ...) {
    print(1, format_str);
}

int main(int argc, const char * argv[]) {
    // insert code here...
    int test = 2;
    call_print("test with %d", test);
    // print(1, "test with %d", test);
    return 0;
}

好的,我编辑了代码以使其可以运行,看起来扭曲的函数就是问题出现的地方,我应该怎么做?

如果直接调用打印,它可以正常工作,如果使用call_print,它将打印&#34;测试1606416520&#34;,如果删除第一个参数&#34; int i&#34;,它可以正常工作.. ..

2 个答案:

答案 0 :(得分:2)

call_print未将参数'test'传递给print

跳过call_print并直接致电print

答案 1 :(得分:0)

似乎我有两种方法可以使它工作,一种是C ++ 11的variadic template,根据我的项目情况,我选择第二种方法,通过将va_start()移动到warp函数call_print()然后更简单将va_list传递给print(),最终的代码将是这样的:

void print(int i, const char* format_str, va_list& argptr) {
    char buffer[1024] = {0};
    vsprintf(buffer, format_str, argptr);
    // log on screen
    std::cout << (char*)buffer << std::endl;
}

void call_print(const char* format_str, ...) {
    // get parameters
    va_list argptr;
    va_start(argptr, format_str);
    print(1, format_str, argptr);
    va_end(argptr);
}

int main(int argc, const char * argv[]) {
    // insert code here...
    int test = 2;
    call_print("test with %d", test);
    // print(1, "test with %d", test);
    return 0;
}

使用C ++ 11的可变参数模板需要这样,需要在其他C ++标志中添加“-std = c ++ 11”:

void print(int i, const char* format_str, ...) {
    // get parameters
    va_list argptr;
    char buffer[1024] = {0};
    va_start(argptr, format_str);
    vsprintf(buffer, format_str, argptr);
    // log on screen
    std::cout << (char*)buffer << std::endl;
    va_end(argptr);
}

template< typename... Args >
void call_print(const char* format_str, Args... args) {
    print(1, format_str, args...);
    //std::snprintf( nullptr, 0, format_str, args... );
}

int main(int argc, const char * argv[]) {
    // insert code here...
    int test = 2;
    call_print("test with %d", test);
    //print(1, "test with %d", test);
    return 0;
}