【问题标题】:Could we define the MACRO name as specific string?我们可以将 MACRO 名称定义为特定字符串吗?
【发布时间】:2016-08-09 16:43:13
【问题描述】:

我们可以实现一个宏来注册打印的名称吗?如下:

1.C

O_PRINT_NAME_REGISTER(NET_TRACE)
O_PRINT_NAME_REGISTER(MAIN_TRACE)

void example(void)
{
     NET_TRACE(" net log");  // LINE 20
     MAIN_TRACE(" main log"); // LINE 21
}

预期输出

示例 - 20:网络日志
示例 - 21:主日志

O_PRINT_NAME_REGISTER()如何定义?

【问题讨论】:

  • NET_TRACE/MAIN_TRACE 应为 MACRO NAME。
  • 我认为你做不到。为了知道行号NET_TRACE必须是宏,但是宏不能创建宏。
  • 您的要求让我感到困惑。你想要一个可以打印跟踪和行号的宏吗??

标签: c macros c-preprocessor


【解决方案1】:

不能从另一个宏定义一个宏。从 C99 6.10.3.4/3“重新扫描和进一步替换”:

生成的完全用宏替换的预处理标记序列 不会作为预处理指令处理,即使它类似于 一,

可以使用宏来准备函数,但是您将不会获得行号和函数名称信息。

例如:

#define O_PRINT_NAME_REGISTER(FN_NAME) static void FN_NAME(char *arg) {  \
                                          printf("%s\n", arg);           \
                                       }

ideone link


您可以改为定义一个宏,将NET_TRACE 之类的宏作为参数并将函数名称和行号信息传递给适当的函数,或者将适当的日志记录函数指针传递给可以处理函数名称和行号信息的通用函数.

【讨论】:

  • 我认为这将是使用函数指针的绝佳机会。
  • @RastaJedi,怎么样?您能帮忙提供详细信息吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 2021-07-22
  • 2011-12-04
相关资源
最近更新 更多