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