Открытие указателя файла для регистрации макроса в заголовочном файле - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь спроектировать каркас ведения журнала для использования в драйвере большой платы 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 во время выполнения, что замедляет мой код на величину даже если это, вероятно, было бы пренебрежимо мало.

Предпочтительно, я бы хотел разделить каждый случай на отдельную функцию, которую я мог бы вызвать с помощью макроса в заголовочном файле, который уже мог бы решить случаи дляведение журнала к моменту предварительной обработки.Таким образом, я мог бы вызывать каждый случай, когда мне нужно, а не обрабатывать тип.Тем не менее, это правильный путь?У меня уже есть инфраструктура, которая делает это и печатает на стандартный вывод, но открытие указателя файла усложняет выполнение всего этого в заголовочном файле и вызов оттуда функций.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Я говорю, что преждевременная оптимизация неэффективна, но вот, пожалуйста.Нет времени на выбор категории:

#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");
}
0 голосов
/ 31 мая 2018

Сделайте тип строковым параметром, а не целым числом, а затем замените его на 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 локальным для функции, а не глобальной переменной.

...