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

C 我们可以将宏名称定义为特定字符串吗?,c,macros,c-preprocessor,C,Macros,C Preprocessor,我们可以实现一个宏来注册打印的名称吗?如下图所示: 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\u PRINT\u NAME\u

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

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\u PRINT\u NAME\u REGISTER()

无法从另一个宏定义宏。从C99 6.10.3.4/3“重新扫描和进一步更换”:

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

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

例如:

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



相反,您可以定义一个宏,该宏以诸如
NET\u TRACE
之类的宏作为参数,并将函数名和行号信息传递给适当的函数,或者将适当的日志函数指针传递给可以处理函数名和行号信息的通用函数。

NET\u TRACE/MAIN\u TRACE应为宏名称。我想你做不到。为了知道行号,NET_TRACE必须是一个宏,但宏不能创建宏。我对您的要求感到困惑。你想要一个可以打印轨迹和行号的宏吗?我想这是一个使用函数指针的绝佳机会。@RastaJedi,怎么做?你能提供详细情况吗?