Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打开文件指针以在头文件中记录宏_C_Logging_Driver_File Pointer - Fatal编程技术网

C 打开文件指针以在头文件中记录宏

C 打开文件指针以在头文件中记录宏,c,logging,driver,file-pointer,C,Logging,Driver,File Pointer,我正试图设计一个用于大型C板驱动程序的日志框架,在该框架中,我记录特定类别的事件:事件、通知、控制消息等 目前,我在文件中有日志记录,由一个打开文件指针的函数驱动,并基于一个switch语句向文件写入一个特定语句,该语句在描述类型的输入参数上进行切换 158 static FILE * fptr = NULL; 159 void log_to_file(const char *str, int type) 160 { 161 if(fptr == NULL

我正试图设计一个用于大型C板驱动程序的日志框架,在该框架中,我记录特定类别的事件:事件、通知、控制消息等

目前,我在文件中有日志记录,由一个打开文件指针的函数驱动,并基于一个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语句,这会使我的代码慢一点,即使它可能是可忽略的

最好,我希望将每个案例分解为一个单独的函数,我可以使用头文件中的宏调用该函数,在预处理完成时,该函数已经可以解决日志记录的案例。这样,我可以在需要时调用每个案例,而不必处理类型。然而,这是正确的道路吗?我已经有了一个框架,可以这样做并打印到stdout,但是打开一个文件指针会使在头文件中执行所有这些操作和从那里调用函数变得复杂


有什么建议吗?

将该类型设置为字符串参数而不是整数,然后用
fprintf
替换它

158 static FILE * fptr = NULL;
159 void log_to_file(const char *str, const char *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     {
            fprintf(fptr, "[%s] [%s] %s\n", get_time(), type, str);
            fflush(fptr);
        }

顺便说一句,您可能应该将
fptr
设置为函数的局部变量,而不是全局变量。

我说这是无效的过早优化,但现在开始。没有时间选择任何类别:

#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");
}
#包括
#包括
静态文件*fptr;
#定义MK_日志(下部、上部)\
无效日志u##下(char const*str){\
fptr=fptr?fptr:fopen(“file.txt”,“a+”)\
如果(!fptr)printf(“打开文件时出错!\n”)\
else{fprintf(fptr,[%s][“#Upper”]%s\n”,get_time(),str;fflush(fptr);}\
} 
char const*get_time(void){返回“now”;}
MK_日志(事件,事件)
MK_日志(notif,notif)
MK_日志(ctrl,ctrl)
int main()
{
记录事件(“事件”);
log_notif(“notif”);
log_ctrl(“a ctrl”);
系统(“cat file.txt”);
}

为什么要使用宏?为什么不为
log\u event
log\u notif
log\u ctrl
定义单独的函数?为什么要使用开关?将类型字符串放入数组中,并使用
fprintf(fptr,[%s][%s]%s\n],get_time(),typestrings[type],str)
或将字符串设为参数:
#将日志事件(str)log_定义为文件(str,“event”)
担心解析开关所需的时间是无稽之谈。每个
f*
调用的开销都会大得多。打开文件指针与这个问题有什么关系?