变量函数参数的奇怪问题
Weird issue of variable function parameter
我有一个打印功能运行良好,今天我想在这个函数中添加另一个参数,所以我将其添加为第一个参数,但是所有带有额外参数(例如"%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;
}
相关文章:
- Visual Studio中的函数声明和函数定义问题
- C++quit()函数中可能存在作用域问题
- 类似于strcat()的函数出现问题
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 类C++中的函数问题(LNK2019和LNK1120错误)
- c++binary_search函数排序数组(流行名称搜索)出现问题
- 关于简单C++函数(is_palindrome)的逻辑的问题
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- constexpr构造函数需要常量成员函数时出现问题
- 添加存储在向量中的大整数的函数出现问题
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 关于 c++ 函数中指针赋值的简单问题
- 如何在标头中声明(或定义)函数的问题
- 有关 c++ 构造函数的问题
- 模板类转换问题 - 无法推断调用的函数
- 从 C++ 中的函数返回数组地址问题
- 关于复制构造函数的一个棘手问题
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题