0

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

助言がありますか?

4

2 に答える 2

0

型を整数ではなく文字列パラメーターにしてから、 で置き換え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グローバル変数ではなく、関数に対してローカルにする必要があります。

于 2018-05-31T16:13:39.283 に答える