Mac OSX下自定义getline函数遇类型冲突:编译器要求额外参数
这个问题我碰到过好几次了,根源很简单——你自己写的getline函数和Mac OSX系统标准库里的同名函数撞车了!
为什么会报错?
在POSIX兼容系统(包括你的Mac OSX 10.11.6)中,<stdio.h>头文件已经内置了一个标准的getline函数,它的完整原型是:
ssize_t getline(char **restrict lineptr, size_t *restrict n, FILE *restrict stream);
这个函数用于从指定的输入流(比如stdin)读取一行内容,需要3个参数,和你自己定义的双参数版本类型完全不匹配。编译器看到你声明的getline和标准库的版本冲突,就会抛出conflicting types错误。
你的拼写没有问题,也不是参数传入错误,纯粹是函数名称和系统标准库重名了。
解决方案
这里有几个可行的解决办法,按推荐程度排序:
最稳妥:给你的函数改名
直接把自己的getline改成其他名字,比如my_getline、custom_getline或者read_line。这样彻底避免了和标准库函数的冲突,是最省心的做法,也不会留下任何潜在的兼容性隐患。限定函数作用域(单文件场景适用)
如果你的程序只有一个源文件,可以在函数声明和定义前加上static关键字,让函数只在当前文件内可见:static int getline(char *line, int maxline) { // 你的函数实现 }这样编译器就不会把它和全局作用域的标准库
getline混为一谈了,但多文件项目不适用这个方法。编译时禁用标准库的getline
如果你坚持要用getline这个名字,可以强制编译器使用旧版C标准(比如C90),这样标准库就不会暴露POSIX引入的getline函数。编译时加上-std=c90选项即可:gcc -std=c90 longest-line.c -o longest-line不过这个方法可能会禁用其他POSIX特性,需要根据你的项目需求权衡。
内容的提问来源于stack exchange,提问作者tscott1

