我有一个类,它包含一个"错误"函数,可以格式化一些文本.我想接受可变数量的参数,然后使用printf格式化它们.
例:
class MyClass
{
public:
void Error(const char* format, ...);
};
Run Code Online (Sandbox Code Playgroud)
Error方法应该接受参数,调用printf/sprintf来格式化它然后用它做一些事情.我不想自己编写所有格式,因此尝试找出如何使用现有格式是有意义的.
可能重复:
C/C++:传递可变数量的参数
我目前正在使用我的C文件中声明的以下宏.
#define COMMON_Print(...) printf (__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)
现在该调用工作得很好,但事实证明我需要能够创建一个看起来像这样的C函数:
void COMMON_Print(...)
{
printf (__VA_ARGS__);
}
Run Code Online (Sandbox Code Playgroud)
因此该功能不起作用,我收到错误
"错误:未定义的标识符__VA_ARGS__"
我的项目的复杂性需要有一个函数,因为它是一个接口......那么如何获取参数...并将它们传递给printf函数?或者更好的是我做错了什么?
谢谢!
我使用C++编写代码并对省略号有一些问题:
是否可以将类或类指针传入省略号?
基本上我想要做的是传递char*和的类型中的可变数量的参数class.我目前正在使用省略号并试图弄清楚如何传入课堂.如果省略号不适用于此处,有哪些选项?
我想让用户直接调用函数,func( params 1, params2, ...)而不是在将向量或数组作为参数传递给函数之前先将params分配给向量或数组.
假设你有2个功能:
void func(int x,int y,...)
{
//do stuff
}
void func2(int x,...)
{
func(x,123,...);
}
Run Code Online (Sandbox Code Playgroud)
你怎么能让这个工作,例如将arg-list传递给另一个函数?
编辑:这是重复,有人可以合并他们或其他什么?
我想创建一个函数,该函数将采用可变数量的不同类型的参数。我的问题是如何解析参数类型。就像调用者可以以任何顺序传递任何类型的参数(不指定格式说明符)。所以在调用函数中我如何区分类型。
如何打印函数 var_argument 中调用者传递的所有值?
假设我想在调用者传递的参数的 var_argument 函数中执行 sprintf
这是我的 C 代码
#include <stdio.h>
#include <stdarg.h>
void var_argument(int num,...);
int main()
{
var_argument(3,"Hello",7.87f,6);
var_argument(3,7.87f,"Hello",6);
return 0;
}
void var_argument(int num,...)
{
char str[80];
/* What code should I write to differentiate between types and to print all the values passed by the caller */
va_list list;
va_start(list,num);
/* How to do sprintf of the parameter passed to this function and store
the formatted output in the array str */
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
C/C++:传递可变数量的参数
根据功能申报方式
return-type function-name(parameter-list, ...) {body ...}
以下代码是一种重载吗?
(在A_FILE.h中)
typedef VOID *FUNCTION(UINTN Number, ...);
似乎我可以将一个Number参数或更多参数传递给FUNCTION函数,参数的数量是否取决于函数的实现?
我试图在运行时为函数调用生成一个参数列表,但我想不出在c ++中实现这一点的方法.
这是我写的助手库.我通过网络从客户端获取输入数据,并使用该数据调用用户先前设置的函数指针.该函数采用一个字符串(类似于printf的标记)和不同数量的参数.我需要的是根据从客户端收到的数据添加更多参数的方法.
我将函数存储在函数指针的映射中
typedef void (*varying_args_fp)(string,...);
map<string,varying_args_fp> func_map;
Run Code Online (Sandbox Code Playgroud)
一个示例用法是
void printall(string tokens, ...)
{
va_list a_list;
va_start(a_list, tokens);
for each(auto x in tokens)
{
if (x == 'i')
{
cout << "Int: " << va_arg(a_list, int) << ' ';
}
else if(x == 'c')
{
cout << "Char: " << va_arg(a_list, char) << ' ';
}
}
va_end(a_list);
}
func_map["printall"] = printall;
func_map["printall"]("iic",5,10,'x');
// prints "Int: 5 Int: 10 Char: x"
Run Code Online (Sandbox Code Playgroud)
当硬编码函数调用及其参数时,这很好用,但如果我收到了数据"CreateX 10 20",程序需要能够自己调用参数.例如
// func_name = "CreateX", tokens …Run Code Online (Sandbox Code Playgroud) 实现CLogClass以进行体面的日志记录后我也定义了宏,但它只适用于一个参数......
class CLogClass
{
public:
static void DoLog(LPCTSTR sMessage, ...);
};
#define DebugLog(sMessage, x) ClogClass::DoLog(__FILE__, __LINE__, sMessage, x)
Run Code Online (Sandbox Code Playgroud)
好吧,当用超过2个参数调用它时会失败:( ...它是否可以避免它?它能以某种方式转换为模板吗?
编辑:Variadic宏在VS 2005中引入(但我目前在VS 2003 ...).有什么建议吗?
int open(const char *path, int oflag, ... );
Run Code Online (Sandbox Code Playgroud)
问题是它的论点不固定,
有没有办法包裹它?
int my_open(const char *path, int oflag, ... ){
}
Run Code Online (Sandbox Code Playgroud) 我想实现一个Myprintf()接受类似参数的函数printf().现在我这样做:
sprintf(demoString, "Num=%d String=%s", num, str);
Myprintf(demoString);
Run Code Online (Sandbox Code Playgroud)
我想将此函数调用替换为:
Myprintf("Num=%d String=%s", num, str);
Run Code Online (Sandbox Code Playgroud)
这怎么可能?
I'd like to create a proxy to fprintf, like so:
void raise_exception(char *filename, int line, char *format_string, ...) {
fprintf(stderr, "Exception in `%s`:%d!\n", filename, line);
fprintf(stderr, format_string, ...);
exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)
But what do I put in the place of the second ellipsis? Is it at all possible?
I'd like to simplify it even a bit more like so:
#define RAISE(...) raise_exception(__FILE__, __LINE__, ...)
Run Code Online (Sandbox Code Playgroud)
But I don't think this would work either.
Any ideas? Thanks!
Straight from Wikipedia: …
我的程序中有一个函数来计算给定目录中的文件数.该函数将输入参数作为目录名称和文件名的扩展名(必须在目录中计数的文件类型).
我想使它通用,以便函数的调用者可以指定任何数量的文件扩展名,可以将其作为输入参数,然后计算具有这些扩展名的特定文件.
void getNames(string dirName, string fileExtension1, string fileExtension2, string fileExtension3){
vector<string> fileNames = //do some operations
if(fileType == fileExtension1 || fileType==fileExtension2....){
//increase count
}
return fileNames;
}
Run Code Online (Sandbox Code Playgroud)
如何更改此功能以便它接受任意数量的参数然后在函数内使用相同的参数来计算文件数?