《C程序设计语言》1.9节字符数组示例代码编译报错求助
解决K&R《C程序设计语言》1.9节示例代码编译冲突问题
问题原因
你遇到的编译错误是因为macOS系统的标准库(stdio.h)中已经内置了一个getline函数,它的签名是:
ssize_t getline(char ** __restrict __linep, size_t * __restrict __linecapp, FILE * __restrict __stream)
而你从书中实现的getline签名是int getline(char s[], int lim),两者参数数量、类型完全不匹配,因此编译时触发了类型冲突和参数错误。
K&R的这本书出版时,POSIX标准还未将getline纳入标准库,所以书中使用了这个函数名;如今主流系统都支持POSIX扩展,才导致了命名冲突。
解决方案:重命名自定义函数
最直接且无副作用的解决方法是把你实现的getline函数改名,比如改成my_getline,需要修改三处:
- 函数声明
- main函数中的调用
- 函数定义
修改后的完整代码如下:
#include <stdio.h> #define MAXLINE 1000 int my_getline(char line[], int maxline); void copy(char to[], char from[]); int main() { int len; int max; char line[MAXLINE]; char longest[MAXLINE]; max = 0; while ((len = my_getline(line, MAXLINE)) > 0) { if (len > max) { max = len; copy(longest, line); } } if (max > 0) printf("%s", longest); return 0; } int my_getline(char s[], int lim) { int c, i; for (i=0; i<lim-1 && (c=getchar()) != EOF && c != '\n'; ++i) { s[i] = c; } if (c == '\n') { s[i] = c; ++i; } s[i] = '\0'; return i; } void copy(char to[], char from[]) { int i; i = 0; while ((to[i] = from[i]) != '\0') ++i; }
可选方案:指定C标准编译
如果你不想修改函数名,可以在编译时指定使用C99标准(该标准中没有getline函数),编译命令如下:
gcc -std=c99 scratch.c -o scratch
不过这种方法依赖编译选项,跨平台兼容性不如重命名稳定。
内容的提问来源于stack exchange,提问作者branperr
相关产品推荐
相关产品推荐

