20

私は C プログラミングで getline を使用することを学んでおり、http://crasseux.com/books/ctutorial/getline.htmlのコードを試しました。

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

int main(int atgc, char *argv[])
{
    int bytes_read = 1;
    int nbytes = 10;
    char *my_string;

    my_string = (char *)malloc(nbytes+1);

    puts("Please enter a line of text");

    bytes_read = getline(&my_string, &nbytes, stdin);

    if (bytes_read == -1)
    {
        puts ("ERROR!");
    }
    else
    {
        puts ("You typed:");
        puts (my_string);
    }

    return 0;
 }

ただし、問題は、コンパイラがエラーを返し続けることです: undefined reference to 'getline' . 何が問題なのか教えてください。ありがとうございました!

Win7 64bit + Eclipse Indigo + MinGW を使用しています

4

3 に答える 3

18

他の回答はこれのほとんどをカバーしていますが、いくつかの問題があります。まず、getline()C 標準ライブラリにはありませんが、POSIX 2008 拡張機能です。通常、マクロ _POSIX_C_SOURCE が適切な値で定義されるため、POSIX 互換コンパイラで使用できます。標準化される前の古いコンパイラを使用している可能性があります。getline()この場合、これは GNU 拡張であり、#define _GNU_SOURCE事前#include <stdio.h>に有効にする必要があり、gcc などの GNU 互換コンパイラを使用している必要があります。

さらに、nbytestypesize_tではなく、 type を持つ必要がありintます。少なくとも私のシステムでは、これらはサイズが異なり、size_tより長く、 a のint*代わりに aを使用するsize_t*と重大な結果が生じる可能性があります (また、デフォルトの gcc 設定でコンパイルされません)。詳細については、getline のマニュアル ページ (http://linux.die.net/man/3/getline) を参照してください。

その変更を行うと、プログラムはコンパイルされ、私のシステムで正常に実行されます。

于 2012-10-28T22:53:22.467 に答える
9

私もMinGWを使っています。MinGW ヘッダーを確認getline()しましたが、C ヘッダーには表示されず、C++ ヘッダーにのみ表示されます。これは、getline()MinGW に C 関数が存在しないことを意味します。

于 2016-03-17T16:39:39.997 に答える
7

getline私のマニュアルページによると、それを使用するには機能テストマクロを設定する必要があります。

_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700

glibc 2.10 以降の場合、

_GNU_SOURCE

それ以前は。

于 2012-10-28T20:43:48.627 に答える