通常,除了提供函数声明之外,C标准头文件还可以提供"屏蔽宏"以使事情更快.例如,如果我包含ctype.h,则头文件将声明
int isdigit(int c);
Run Code Online (Sandbox Code Playgroud)
但它也可能用宏来掩盖声明.我相信这是一个isdigit符合C标准的便携式宏:
#define isdigit(c) ((c) >= '0' && (c) <= '9')
Run Code Online (Sandbox Code Playgroud)
当然,这个宏也很危险,因为如果在定义宏时执行此操作会引入未定义的行为:
int c = 'A';
printf("%d\n", isdigit(c++));
Run Code Online (Sandbox Code Playgroud)
为了避免UB在这个假设的情况下,我必须用parens包围函数名: (isdigit)(c++).所以,我的问题是:标准头可以定义哪种屏蔽宏有什么限制吗?如果参数表达式具有副作用,或者它们在技术上是否允许具有奇怪的行为(例如我们在上面看到),它们是否保证不会导致未定义的行为?限制在哪里?