Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 变函数参数的奇异问题_C++_Linux_Parameters - Fatal编程技术网

C++ 变函数参数的奇异问题

C++ 变函数参数的奇异问题,c++,linux,parameters,C++,Linux,Parameters,我有一个打印函数工作得很好,今天我想在这个函数中添加另一个参数,所以我添加了它作为第一个参数,但所有带有额外参数(如“%d”)的消息都显示不正确,我搜索了数小时试图理解为什么,但没有得到任何有用的信息,我是否做错了什么 我试着加上“\uuucdecl”,它也不起作用 如果我删除了第一个参数“inti”,那么一切都正常工作。 它在OSX10.11上运行,带有Xcode 7.1.2控制台应用程序 void print(int i, const char* format_str, ...) {

我有一个打印函数工作得很好,今天我想在这个函数中添加另一个参数,所以我添加了它作为第一个参数,但所有带有额外参数(如“%d”)的消息都显示不正确,我搜索了数小时试图理解为什么,但没有得到任何有用的信息,我是否做错了什么

我试着加上“\uuucdecl”,它也不起作用

如果我删除了第一个参数“inti”,那么一切都正常工作。 它在OSX10.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;
}
void打印(int i,const char*格式\u str,…){
//获取参数
va_列表参数;
字符缓冲区[1024]={0};
va_开始(argptr,格式_str);
vsprintf(缓冲区、格式、argptr);
//登录屏幕

std::cout
call\u print
未将参数“test”传递到
print


跳过
call_print
并直接调用
print

我似乎有两种方法可以让它工作,一种是C++11,根据我的项目情况,我选择了第二种方法,更简单的方法是将va_start()移动到warp函数call_print(),然后将va_列表传递到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;
}
void打印(int i、const char*format\u str、va\u list和argptr){
字符缓冲区[1024]={0};
vsprintf(缓冲区、格式、argptr);
//登录屏幕

std::cout哪里定义了
buffer
?假设它是char
buffer[some value]
,然后尝试
buffer是预定义的,并且它足够大,“请发布一个。@slashmais这可能会有什么不同?看看这个问题:如果我真的想扭曲它,我可以做什么。我尝试将va_list和va_start放入调用_print(),然后将va_list传递给print()”,但这种方法看起来不太好,我想知道是否有任何方法可以让它更优雅地工作。@Jimmyliu:看看我的答案:-可能会有帮助
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;
}