通过GCC编译定义函数getline的C程序

通过GCC编译定义函数getline的C程序

我正在尝试通过 GCC 编译一个旧的 C 程序,该程序定义并使用名为 的函数getline,该函数与 GNU C 库中的同名函数冲突。你怎样才能编译它?传递-ansi -D_XOPEN_SOURCE_EXTENDED给 GCC 给我带来奇怪的错误strings.h

/usr/include/strings.h:74:16: error: expected identifier or '(' before '__extension__'

中的相关行strings.h是:

extern char *index (__const char *__s, int __c)
 __THROW __attribute_pure__ __nonnull ((1));

答案1

虽然该-fno-builtin-function选项gcc适用于内置函数,例如mallocstrlen(请参阅GCC提供的其他内置函数),它不适用于glibc内置的 GNU 扩展,例如getline函数。

与 jw013 的链接指出的一些解决方案类似,您可以尝试#define在源文件中插入语句来重命名getline程序定义的函数,例如#define getline my_getline.

下面是一个小代码示例来说明这种方法。

/*

gcc -Wall -Wextra -o mystrdup mystrdup.c

./mystrdup

*/

#include <stdio.h> 
#include <string.h>

// mystrdup.c:14: error: conflicting types for 'strdup'
//#define strdup my_strdup

char *strdup(char *str) {
   str = str;
   return str;
}

int main (void) { 
   char *str = 0;
   char mystr[] = "Hello, mystrdup!";
   str = strdup(mystr);
   printf("%s\n", str);
   return 0;
} 

答案2

尝试:

gcc -fno-builtin-getline ...

欲了解更多信息,请参阅:

man gcc | less -p '-fno-builtin'

答案3

在 GCC 文档中,他们处理此问题的建议是添加 -ansi 编译器开关,因为 getline 是 ansi 的 GCC 扩展。

相关内容