我的打印功能运行良好,今天我想在此函数中添加另一个参数,所以我将其添加为第一个参数,但所有带有额外参数的消息如"%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;,它可以正常工作.. ..
答案 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;
}