我最终不得不记住宏是什么,并在阅读时将其替换在我的脑海中。
这似乎对宏的命名反映不佳。我假设你不必模拟预处理器,如果它是log_function_entry()
宏。
我遇到的那些直观且易于理解的总是像小迷你函数,所以我总是想知道为什么它们不仅仅是函数。
通常它们应该是这样,除非它们需要对通用参数进行操作。
#define max(a,b) ((a)<(b)?(b):(a))
将适用于任何类型<
操作员。
宏不仅仅是函数,还允许您使用源文件中的符号执行操作。这意味着您可以创建新的变量名称,或引用宏所在的源文件和行号。
在 C99 中,宏还允许您调用可变参数函数,例如printf
#define log_message(guard,format,...) \
if (guard) printf("%s:%d: " format "\n", __FILE__, __LINE__,__VA_ARGS_);
log_message( foo == 7, "x %d", x)
其中格式的工作原理如下printf
。如果守卫为真,它将输出消息以及打印该消息的文件和行号。如果它是一个函数调用,它不会知道您调用它的文件和行,并且使用vaprintf
会多一点工作。