c - 在头文件中打开用于记录宏的文件指针
问题描述
我正在尝试设计一个用于大型 C 板驱动程序的日志记录框架,我在其中记录特定类别的发生:事件、通知、控制消息等。
目前,我在文件中有日志记录,由打开文件指针的函数驱动,并根据 switch 语句将特定语句写入文件,该 switch 语句打开描述类型的输入参数。
158 static FILE * fptr = NULL;
159 void log_to_file(const char *str, int type)
160 {
161 if(fptr == NULL)
162 {
163 fptr = fopen("file.txt", "a+");
164 }
165
166 if (fptr == NULL)
167 {
168 printf("Error opening file!\n");
169 }
170 else
171 {
172
173 switch (type)
174 {
175 case 1: //EVENT
176 fprintf(fptr, "[%s] [EVENT] %s\n", get_time(), str);
177 fflush(fptr);
178 break;
179 case 2: //NOTIFICATION
180 fprintf(fptr, "[%s] [NOTIF] %s\n", get_time(), str);
181 fflush(fptr);
182 break;
183 case 3: //CTRL
184 fprintf(fptr, "[%s] [CTRL] %s\n", get_time(), str);
185 fflush(fptr);
186 break;
187 default:
188 fprintf(fptr, "[%s] [UNRECOGNIZED] %s\n", get_time(), str);
189 fflush(fptr);
190 break;
然后我使用这些宏调用这个函数:
32 #define log_event(str) log_to_file(str, 1)
33 #define log_notif(str) log_to_file(str, 2)
34 #define log_ctrl(str) log_to_file(str, 3)
但是,每次我在运行时调用这个函数时,我都必须在运行时解析 switch 语句,这会减慢我的代码速度,即使它可能可以忽略不计。
最好,我想将每个案例拆分为一个单独的函数,我可以使用头文件中的宏调用该函数,这可以在预处理完成时解决记录的案例。这样我可以在需要时调用每种情况,而不必处理类型。然而,这是正确的道路吗?我已经有一个框架可以执行此操作并打印到标准输出,但是打开文件指针会使在头文件中执行所有这些操作并从那里调用函数变得复杂。
有什么建议么?
解决方案
我说这是无效的过早优化,但你去吧。没有时间花在选择类别上:
#include <stdio.h>
#include <stdlib.h>
static FILE *fptr;
#define MK_LOG(Lower,Upper) \
void log_##Lower(char const *str){ \
fptr = fptr ? fptr : fopen("file.txt", "a+"); \
if(!fptr) printf("Error opening file!\n"); \
else { fprintf(fptr, "[%s] [" #Upper "] %s\n", get_time(), str); fflush(fptr); } \
}
char const* get_time(void) { return "now"; }
MK_LOG(event,EVENT)
MK_LOG(notif,NOTIF)
MK_LOG(ctrl,CTRL)
int main()
{
log_event("an event");
log_notif("a notif");
log_ctrl("a ctrl");
system("cat file.txt");
}
推荐阅读
- xcode - Xcode:评论中的链接可以点击吗?
- python - pivy.coin (COIN3D) 箭头绘图不旋转 (FreeCAD - Python)
- python - 如何从 Jax 中的损失函数返回值字典?
- ionic-framework - 他们是否有任何方法可以在设备上禁用离子日期时间选择器滚动振动 In Ionic
- jupyter-notebook - JupyterLab 移动折叠单元组的所有内容
- python - 如何对从 pdf 文档中提取的数字列表进行排序?
- reactjs - 反应元素
| 未定义',但提供了多个孩子。Material-UI 淡入淡出 - java - 过滤器连接多个表的规范,包括嵌入的主键
- javascript - 有没有办法将 JavaScript 对象保存到 JSON 文件中,我可以选择保存它的目录吗?
- svg - 在带有 vuejs 的 svg 文本字段中使用很棒的字体