变量函数参数的奇怪问题

Weird issue of variable function parameter

本文关键字:问题 函数 参数 变量      更新时间:2023-10-16

我有一个打印功能运行良好,今天我想在这个函数中添加另一个参数,所以我将其添加为第一个参数,但是所有带有额外参数(例如"%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;
}
好的,我

编辑了代码使其可运行,看起来扭曲的函数是问题出现的地方,我应该如何使其正确?

如果直接调用 print,它可以正常工作,如果使用 call_print,它将打印"用 1606416520 进行测试",如果删除第一个参数"int i",它要么工作......

call_print没有将参数"test"传递给print

跳过call_print,直接拨打print

似乎我有两种方法可以使其工作,一种是 C++11 的可变参数模板,根据我项目的情况,我选择第二种更简单的方式,通过将 va_start() 移动到扭曲函数 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;
}