向Char*数组中的条目传递可变数量的参数
我一直在使用以下链接:增强我正在处理的项目的当前错误日志记录 我的最终目标是生成一个枚举“错误类型”。我会将这些错误类型映射到一个char*的查找表,我可以用它来记录错误的更详细解释 这样,我将所有错误代码和相应的错误字符串放在一个中心位置,可以轻松地修改/查找消息和错误代码,而无需深入挖掘代码 作为PoC,我的头文件包含以下内容:向Char*数组中的条目传递可变数量的参数,c,error-handling,string-formatting,C,Error Handling,String Formatting,我一直在使用以下链接:增强我正在处理的项目的当前错误日志记录 我的最终目标是生成一个枚举“错误类型”。我会将这些错误类型映射到一个char*的查找表,我可以用它来记录错误的更详细解释 这样,我将所有错误代码和相应的错误字符串放在一个中心位置,可以轻松地修改/查找消息和错误代码,而无需深入挖掘代码 作为PoC,我的头文件包含以下内容: typedef enum { ECODE_OK = 0, // OK ECODE_SAMPLE_ERR = 1, ECODE
typedef enum {
ECODE_OK = 0, // OK
ECODE_SAMPLE_ERR = 1,
ECODE_LAST
} myEcodes;
char * ecodeMap[ECODE_LAST+1];
char * ecodeName(myEcodes err);
我用C语言实现的标题如下:
char * ecodeMap[ECODE_LAST+1] =
{
"No error to report",
"Example Error Code - Invalid Value",
"Last ecode place holder"
};
char * ecodeName(myEcodes err)
{
return (char *) eyescanEcodeMap[err];
}
我的问题是,假设我有以下代码段来记录我遇到的错误:
fprintf(fp, "%s", ecodeName(ECODE_SAMPLE_ERR));
如果我希望ECODE_SAMPLE_ERR实际包含一个格式化字符串,如
"Example Error Code - Invalid Values: %d %d", myVarInt1, myVarInt2
而不仅仅是
"Example Error Code - Invalid Value"
在我的char*数组中格式化单个字符串,以便在特定条目中包含变量值的最佳方式是什么?如果主要目的是将print与其他变量值一起添加,请将错误字符串设置为常量。在写入文件fp时,只需添加附加值即可
fprintf(fp, "%s: %d %d", ecodeName(ECODE_SAMPLE_ERR), myVarInt1, myVarInt2);
您希望使用多少格式化字符串?也就是说,您将有多少不同类型的格式化字符串?这取决于错误。有些可能只是没有格式的字符串,例如,
“您已失去与设备的连接”
。其他变量可能有多个,例如,“DAC%d、脉冲宽度%d和周期%d的当前激光设置导致无效激光功率%f”,var1、var2、var3、var4
。我想说的是,大多数人不需要错误,只有极少数人需要在字符串中插入5个以上的变量。我不明白。是调用fprintf(fp,“%s”,get_error_string(error_code))的实际日志函数代码>。请原谅我更改了名称,我试图像您那样键入它,但我做不到。我想这两个链接可以帮助您:我希望您知道以下语句:strerror(error)对于大多数错误情况,代码>将返回合适的字符串。但是,对于特定于应用程序的错误,类似这样的代码:在代码中:CommonWriteCdsLog(ellu-Critical,get-pFormatString(eFormat-CFFL-string),\uu-FILE-uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu代码>对我来说非常有效。是从格式字符串表中选择的“get_pFormatString()”,是从值的枚举中选择的ellu Critical
,以确定是否要记录消息。(cont)不幸的是,有时我需要将变量值插入字符串的不同部分,而不仅仅是将它们附加到末尾。最好保持错误代码的简单。这类错误代码应该是常量。我不明白你为什么要在这些字符串之间加上后缀。您可以将字符串更改为尽可能简单和通用。