Я пытаюсь спроектировать каркас ведения журнала для использования в драйвере большой платы 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 во время выполнения, что замедляет мой код на величину даже если это, вероятно, было бы пренебрежимо мало.
Предпочтительно, я бы хотел разделить каждый случай на отдельную функцию, которую я мог бы вызвать с помощью макроса в заголовочном файле, который уже мог бы решить случаи дляведение журнала к моменту предварительной обработки.Таким образом, я мог бы вызывать каждый случай, когда мне нужно, а не обрабатывать тип.Тем не менее, это правильный путь?У меня уже есть инфраструктура, которая делает это и печатает на стандартный вывод, но открытие указателя файла усложняет выполнение всего этого в заголовочном файле и вызов оттуда функций.
Есть предложения?