イベント、通知、制御メッセージなどの特定のカテゴリの発生をログに記録する、大規模な 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 に出力するフレームワークは既に持っていますが、ファイル ポインターを開くと、ヘッダー ファイルでこれらすべてを実行し、そこから関数を呼び出すことが複雑になります。
助言がありますか?