c - 字母 A 和 M 对预处理器意味着什么

标签 c debugging c-preprocessor

所以我正在学习 C,我遇到了这个

 #ifndef _dbg_h_
 #define _dbg_h

 #include<stdio.h>
 #include<errno.h>
 #ifdef NDEBUG
 #define debug(M,...)// I do not know why M is an argument here
 #else 
 #define debug(M,...)fprintf(stderr,"DEBUG %s:%d: " M "\n",\
 _FILE_,_LINE_,##_VA_ARGS_)
 #endif
 #define clean_errno()(errno==0?"None":strerror(errno))

 #define log_err(M,...)fprintf(stderr,\"[ERROR](%s:%d: errno: %s)" M "\n"
 _FILE_,_LINE_ ,\clean_errno(),##_VA_ARGS_)
 ...
 #define check(A,M,...)if(!(A)){\         /*why is A an arg here */
  log_err(M,##_VA_ARGS_);errno=0;goto error;}

为什么这些需要 M 和 A 作为参数以及它们在哪里声明/初始化

最佳答案

名称MA对于预处理器没有特殊含义。

例如,

Mdebug 宏的第一个参数的名称。当名称 M 出现在 debug 宏的定义中时,将替换为调用 debug 时传递的第一个参数的值.

... 表示它是一个可变宏,可以接受可变数量的参数。

一个更简单的例子:

#define MY_MACRO(ARG) (2*(ARG))

printf("%d\n", MY_MACRO(10));

在调用 MY_MACRO(10) 中,名称 ARG 被替换为 10,导致整个宏调用扩展为 (2*(10))。 (额外的括号是为了避免运算符优先级问题。)

关于c - 字母 A 和 M 对预处理器意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38021211/

相关文章:

c++ - GNU 编译器调试 'Level'

整个程序中__TIME__的常量值

c - 如何查看哪个库拥有 lldb 回溯的符号

c - 显示用户输入的字符串的字符。 C语言

c - 使用指向数组元素的指针比通过索引访问元素慢吗?

ios - malloc 诊断和 malloc 相关环境变量之间有什么关系?

c - 函数指针作为结构成员

c# - 是否可以在 DebuggerDisplay 中使用条件?

使用 C 宏调用关联*函数

c - 常量 C 表达式是在编译时还是在运行时求值?