2017-06-17 6 views
-3

一週間前に、動作しなかったコードでgetlineという関数を作成しました。それ以来、関数のgetlineに名前を付けてコンパイルしようとすると、関数は動作しません。関数の名前を何かに変更すると、関数は再び機能します。私は自分のコンピュータを再起動しましたが(本当に必要ないはずですが)。この名前空間を戻すにはどうしたらいいですか?コンパイラはその名前空間にスタックされた関数を持っています(おそらく?)。 mac

例エラーメッセージ:

Numens-MBP:c examples mycotic$ cc testing.c 
testing.c:9:5: error: conflicting types for 'getline' 
int getline(void); 
    ^
/usr/include/stdio.h:448:9: note: previous declaration is here 
ssize_t getline(char ** __restrict __linep, size_t * __restrict __lineca... 
     ^
testing.c:13:1: warning: type specifier missing, defaults to 'int' 
     [-Wimplicit-int] 
main() 
^ 
testing.c:20:24: error: too few arguments to function call, expected 3, have 0 
     while ((len = getline()) > 0) 
         ~~~~~~~^
/usr/include/stdio.h:448:1: note: 'getline' declared here 
ssize_t getline(char ** __restrict __linep, size_t * __restrict __lineca... 
^ 
testing.c:36:5: error: conflicting types for 'getline' 
int getline(void) 
    ^
/usr/include/stdio.h:448:9: note: previous declaration is here 
ssize_t getline(char ** __restrict __linep, size_t * __restrict __lineca... 
     ^
1 warning and 3 errors generated. 
+3

"getline"を関数名として使用することは以前には有効でしたか? 「それは働いた」と「もう働かない」の間に何が起こったのですか?プラットフォームの切り替え?コンパイラのスイッチ?ヘッダー(場所、命名)について何か変更しますか? – Yunnosch

+0

以前の 'getline'関数の使用では、Windows(または他のPOSIX以外のシステム)上のどこですか?または、C++をプログラミングしていましたか? –

答えて

2

getline()は、標準のCライブラリ関数です。関数が標準ライブラリの定義と競合しています。

あなたの機能の別の名前を選択してください。これは取られます。

+7

実際には、[POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html)プラットフォームの標準です。これは標準のC関数ではありません。 –

0

getline()機能はPOSIX 2008の一部です。 POSIX 2001またはPOSIX 1997の一部ではありませんでした。Macでは、-std=c11を指定しても、デフォルトでPOSIX定義が有効になっています。

getline()をサポートしていないPOSIXバージョンを指定することで対処できます。このコードを考えてみましょう - しかし、この「getline()は」行を出力するという事実を無視:あらゆる種類の問題を発生し、

#include <stdio.h> 

extern int getline(int); 

int getline(int num) 
{ 
    printf("%s: %d\n", __func__, num); 
    return num + 1; 
} 

int main(void) 
{ 
    for (int i = 0; i < 5; i++) 
     printf("RV = %d\n", getline(i)); 
    return 0; 
} 

GCC 7.1.0でコンパイルした、またはXCodeの8.3.2からgccclangのいずれかとしPOSIXの相反するタイプgetline()と、このコードで定義されているgetline()のために、問題を回避するために引数を追加しないかぎりです。ソースはファイルgl23.cにありました。

$ /usr/bin/clang -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes \ 
>    -Wstrict-prototypes -Wold-style-definition gl23.c -o gl23 
gl23.c:3:12: error: conflicting types for 'getline' 
extern int getline(int); 
     ^
/usr/include/stdio.h:448:9: note: previous declaration is here 
ssize_t getline(char ** __restrict __linep, size_t * __restrict __linecapp, FILE * __restrict __stream) __OSX_AVAILABLE_STARTIN... 
     ^
gl23.c:5:5: error: conflicting types for 'getline' 
int getline(int num) 
    ^
/usr/include/stdio.h:448:9: note: previous declaration is here 
ssize_t getline(char ** __restrict __linep, size_t * __restrict __linecapp, FILE * __restrict __stream) __OSX_AVAILABLE_STARTIN... 
     ^
gl23.c:14:38: error: too few arguments to function call, expected 3, have 1 
     printf("RV = %d\n", getline(i)); 
          ~~~~~~~^
/usr/include/stdio.h:448:1: note: 'getline' declared here 
ssize_t getline(char ** __restrict __linep, size_t * __restrict __linecapp, FILE * __restrict __stream) __OSX_AVAILABLE_STARTIN... 
^ 
3 errors generated. 
$ 

しかし、あなたは-D_POSIX_C_SOURCE=200112L-D_POSIX_C_SOURCE=199506Lを追加することによって、POSIXの旧バージョンとの適合性を指定した場合、それはきれいにコンパイルし、生産、適切に動作します:

getline: 0 
RV = 1 
getline: 1 
RV = 2 
getline: 2 
RV = 3 
getline: 3 
RV = 4 
getline: 4 
RV = 5 

は、これが唯一であることに注意してくださいPOSIX 2008のその他のすばらしい新機能にはアクセスできなくなりました。

getline()は、標準のC名前空間の一部になりました。標準はISO/IEC 9899:2011ではなくPOSIXですが、関数名を変更してください。 (はい、迷惑ですが、K & R 2nd Editionはgetline()の3つのバージョンを示していますが、このために私のライブラリ関数の名前を変更する必要がありました。その名前は以前のバージョンの予約された名前空間にはありませんでした)必要があると推測する方法がありませんでした。

関連する問題