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

标签 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
}

预期输出

example - 20: net log
example - 21: main log

如何定义O_PRINT_NAME_REGISTER()

最佳答案

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

The resulting completely macro-replaced preprocessing token sequence is not processed as a preprocessing directive even if it resembles one,

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

例如:

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

ideone link


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

关于我们可以将 MACRO 名称定义为特定字符串吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36685605/

相关文章:

Arduino 草图的倒计时器

map - Clojure 宏中关键字的奇怪行为

c++ - 在 C++ 中将类型从参数转换为模板

macros - 有没有办法查看 Crystal 宏扩展到什么内容?

c++ - 将#elif 与#ifdef 一起使用是否合法?

c++ - #pragma pack(show) 与 GCC

c - 使用依赖循环展开循环

c - 为什么这些构造使用前后递增的未定义行为?

c - 了解 C 语言中的宏和预处理器指令

objective-c - #pragma clang 诊断的 Swift 替代方案