所以我正在学习 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 作为参数以及它们在哪里声明/初始化
最佳答案
名称M
和A
对于预处理器没有特殊含义。
M
是 debug
宏的第一个参数的名称。当名称 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/