6464 #endif
6565
6666 #ifndef FC_LOG_POOL_FAIL_RECORD
67- #define FC_LOG_POOL_FAIL_RECORD 0 /**< 序列化日志分配失败是否记录丢失日志长度,需要消耗性能用于空序列化一次 ,个人觉得没必要 */
67+ #define FC_LOG_POOL_FAIL_RECORD 0 /**< 序列化日志内存分配失败是否记录丢失日志长度,需要消耗性能用于空序列化 ,个人觉得没必要 */
6868 #endif
6969
7070 #ifndef FC_LOG_FMT_START
@@ -285,11 +285,8 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
285285//+********************************* 以下部分允许重入 **********************************/
286286#undef fc_log_level
287287
288- #undef fc_log_merge_2
289- #undef fc_log_merge_1
290- #undef fc_log_merge_0
291-
292- #undef fc_log_merge
288+ #undef FC_LOG_MERGE
289+ #undef fc_log_level_record
293290#undef fc_log_format
294291
295292#undef fc_log_error
@@ -317,27 +314,35 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
317314
318315#if FC_LOG_ENABLE
319316
320- #define fc_log_merge_2 (enter_expr , leave_expr ) \
321- fc_using(fc_log_t SAFE_NAME(log_obj) = FC_LOG_OBJ, *scope_log_ptr = &SAFE_NAME(log_obj), { SAFE_NAME(log_obj).merge = true; enter_expr; }, {leave_expr; fc_log_fflush(&SAFE_NAME(log_obj)); })
322-
323- #define fc_log_merge_1 (enter_expr ) \
324- fc_log_merge_2(enter_expr, { (void)0; })
325-
326- #define fc_log_merge_0 () \
327- fc_log_merge_1({ (void)0; })
328-
329- // 根据参数展开为0/1/2个参数的版本,超过2将报错,可以用复合语句{exp1;exp2...expN}算一个参数
330- #define fc_log_merge (...) \
331- FC_CONNECT2(fc_log_merge_, __PLOOC_VA_NUM_ARGS(__VA_ARGS__))(__VA_ARGS__)
332-
317+ // 统一实现:C和C++模式都不接受参数,避免兼容性问题
318+ // FC_LOG_MERGE将作用域内的所有log输出合并为一次输出,大写不带括号,避免与函数混淆
319+ #define FC_LOG_MERGE \
320+ fc_using(fc_log_t SAFE_NAME(log_obj) = FC_LOG_OBJ, \
321+ *scope_log_ptr = &SAFE_NAME(log_obj), \
322+ scope_log_ptr->merge = true, \
323+ fc_log_fflush(scope_log_ptr))
324+
325+ #define fc_log_level_record (_level ) \
326+ do \
327+ { \
328+ if (scope_log_ptr) \
329+ { \
330+ fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
331+ if (SAFE_NAME(log_temp_ptr)->merge) \
332+ SAFE_NAME(log_temp_ptr)->last_level = _level; /* 临时对象实体记录临时等级 */ \
333+ } \
334+ } while (0 );
335+
336+ // 把fc_log_level_record在format中展开,减少一次do...while(0)的开销
333337 #define fc_log_format (text , _level , fmt , ...) \
334338 do \
335339 { \
336340 fc_log_fprintf((fc_log_t *)(scope_log_ptr ? scope_log_ptr : &FC_LOG_OBJ), _level, text "" fmt "" FC_LOG_END, FC_LOG_PREFIX_CONTENT, ##__VA_ARGS__); \
337341 if (scope_log_ptr) \
338342 { \
339343 fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
340- SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_ERROR; /* 临时对象实体记录临时等级 */ \
344+ if (SAFE_NAME(log_temp_ptr)->merge) \
345+ SAFE_NAME(log_temp_ptr)->last_level = _level; /* 临时对象实体记录临时等级 */ \
341346 } \
342347 } while (0 )
343348
@@ -346,75 +351,40 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
346351 #define fc_log_error (fmt , ...) \
347352 fc_log_format(FC_ERROR_TEXT, FC_LOG_LEVEL_ERROR, fmt, ##__VA_ARGS__)
348353 #else
349- #define fc_log_error (fmt , ...) \
350- do \
351- { \
352- if (scope_log_ptr) \
353- { \
354- fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
355- SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_ERROR; /* 临时对象实体记录临时等级 */ \
356- } \
357- } while (0 );
354+ #define fc_log_error (fmt , ...) \
355+ fc_log_level_record(FC_LOG_LEVEL_ERROR)
358356 #endif
359357
360358 #if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_WARNING
361359 #define fc_log_warning (fmt , ...) \
362360 fc_log_format(FC_WARNING_TEXT, FC_LOG_LEVEL_WARNING, fmt, ##__VA_ARGS__)
363361 #else
364- #define fc_log_warning (fmt , ...) \
365- do \
366- { \
367- if (scope_log_ptr) \
368- { \
369- fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
370- SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_WARNING; /* 临时对象实体记录临时等级 */ \
371- } \
372- } while (0 );
362+ #define fc_log_warning (fmt , ...) \
363+ fc_log_level_record(FC_LOG_LEVEL_WARNING)
373364 #endif
374365
375366 #if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_INFO
376367 #define fc_log_info (fmt , ...) \
377368 fc_log_format(FC_INFO_TEXT, FC_LOG_LEVEL_INFO, fmt, ##__VA_ARGS__)
378369 #else
379- #define fc_log_info (fmt , ...) \
380- do \
381- { \
382- if (scope_log_ptr) \
383- { \
384- fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
385- SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_INFO; /* 临时对象实体记录临时等级 */ \
386- } \
387- } while (0 );
370+ #define fc_log_info (fmt , ...) \
371+ fc_log_level_record(FC_LOG_LEVEL_INFO)
388372 #endif
389373
390374 #if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_DEBUG
391375 #define fc_log_debug (fmt , ...) \
392376 fc_log_format(FC_DEBUG_TEXT, FC_LOG_LEVEL_DEBUG, fmt, ##__VA_ARGS__)
393377 #else
394- #define fc_log_debug (fmt , ...) \
395- do \
396- { \
397- if (scope_log_ptr) \
398- { \
399- fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
400- SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_DEBUG; /* 临时对象实体记录临时等级 */ \
401- } \
402- } while (0 );
378+ #define fc_log_debug (fmt , ...) \
379+ fc_log_level_record(FC_LOG_LEVEL_DEBUG)
403380 #endif
404381
405382 #if FC_LOG_FILE_LEVEL >= FC_LOG_LEVEL_VERBOSE
406383 #define fc_log_verbose (fmt , ...) \
407384 fc_log_format(FC_VERBOSE_TEXT, FC_LOG_LEVEL_VERBOSE, fmt, ##__VA_ARGS__)
408385 #else
409- #define fc_log_verbose (fmt , ...) \
410- do \
411- { \
412- if (scope_log_ptr) \
413- { \
414- fc_log_t *SAFE_NAME(log_temp_ptr) = (fc_log_t *)scope_log_ptr; \
415- SAFE_NAME(log_temp_ptr)->last_level = FC_LOG_LEVEL_VERBOSE; /* 临时对象实体记录临时等级 */ \
416- } \
417- } while (0 );
386+ #define fc_log_verbose (fmt , ...) \
387+ fc_log_level_record(FC_LOG_LEVEL_VERBOSE)
418388 #endif
419389
420390 #define fc_log_printf (fmt , ...) \
@@ -458,14 +428,11 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
458428 } while (0)
459429
460430#else
461- #define fc_log_merge_2 (enter_expr , leave_expr )
462- #define fc_log_merge_1 (enter_expr )
463- #define fc_log_merge_0 ()
464-
465- #define fc_log_merge (...) // 空定义即可
431+ #define FC_LOG_MERGE // 空定义即可
466432
467433// clang-format off
468-
434+
435+ #define fc_log_level_record (_level ) ((void)0)
469436 #define fc_log_format (text , level , fmt , ...) ((void)0)
470437 #define fc_log_error (fmt , ...) ((void)0)
471438 #define fc_log_warning (fmt , ...) ((void)0)
@@ -498,7 +465,7 @@ extern fc_pool_t fc_log_pool; // log组件使用的内存池声明,在fc_log.c
498465#if FC_LOG_NOPREFIX_API
499466 #define log_level fc_log_level
500467
501- #define log_merge fc_log_merge
468+ #define LOG_MERGE FC_LOG_MERGE
502469
503470 #define log_error fc_log_error
504471 #define log_warning fc_log_warning
0 commit comments