getline
GNU Cライブラリの同じ名前の関数と競合するC ++という関数を定義し、使用している古いCプログラムをGCCを介してコンパイルしようとしています。どのようにコンパイルできますか? GCCに渡すと-ansi -D_XOPEN_SOURCE_EXTENDED
奇妙なエラーが発生します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
同じ組み込み関数に使用できます(参照malloc
strlen
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拡張だからです。