我们可以将MACRO名称定义为特定字符串吗?

时间:2016-04-18 04:42:36

标签: c macros c-preprocessor

我们可以实施MACRO来注册打印的名称吗?如下所示:

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:net log
示例 - 21:主日志

如何定义O_PRINT_NAME_REGISTER()

1 个答案:

答案 0 :(得分:0)

无法从另一个宏定义宏。从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之类的宏作为参数,并将函数名和行号信息传递给相应的函数,或者将适当的日志函数指针传递给可以处理函数名和行的泛型函数号码信息。