C语言宏与函数的高级特性解析
1. 宏的字符串化与默认参数
在C语言编程中,宏的使用十分广泛,但也存在一些需要注意的细节。例如,简单的字符串化操作# __LINE__并不能达到预期效果。下面是相关宏定义:
// macro_trace.h #define STRINGIFY(X) #X #define STRGY(X) STRINGIFY(X)STRINGIFY宏在参数替换之前就进行字符串化,所以STRINGIFY(__LINE__)的结果是"__LINE__",而不是实际的行号。而STRGY(__LINE__)会先展开为STRINGIFY(25)(假设当前是第25行),最终得到"25"。
另外,还有一个仅在预处理阶段有效的##运算符,它是标记连接运算符,在编写宏库自动生成类型或函数名时很有用。
在C库的一些函数中,部分参数经常使用相同的值。以strtoul函数为例,它接收三个参数:
unsigned long int strtoul(char const nptr[restrict], char** restrict endptr,