调试一段老代码,编译始终报以下错误:
/usr/include/string.h:459: 错误: 给予 function 'void memset(void*, int)' 的实参太多
memset的函数原型为:
void *memset(void *s, int ch, size_t n)
因此,源代码中针对memset的调用参数是没问题的。错误提示中,针对memset的调用仅2个参数,这点很诡异。
查看系统头文件 /usr/include/string.h,发现第459行定义如下:
extern void bzero (void *__s, size_t __n) __THROW __nonnull ((1));
于是猜测,源代码中原本正确的memset函数调用,被解释成了bzero。
在整个工程中搜索bzero,在某个头文件中发现了一行宏定义:
#define bzero(ptr, n) memset(ptr, 0, n)
于是把这行注释掉,重新编译,错误解决。
代码中大量的宏定义,有时确实会对程序编译造成一些奇怪的错误。
因此,应该尽量少用宏定义。