2

次のコードをコンパイルすると:

#define _POSIX_C_SOURCE 200112L
#define _ISOC99_SOURCE
#define __EXTENSIONS__

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

int
main(int argc, char *argv[])
{
    char *symlinkpath = argv[1];
    char actualpath [PATH_MAX];
    char *ptr;
    ptr = realpath(symlinkpath, actualpath);
    printf("%s\n", ptr);
}

realpath 関数の呼び出しを含む行で、次のような警告が表示されます。

warning: assignment makes pointer from integer without a cast

何が起きているか知っている人はいますか?Ubuntu Linux 9.04 を実行しています

4

2 に答える 2

4

これは非常に簡単です。glibc は realpath() を POSIX ではなく GNU 拡張として扱います。したがって、次の行を追加します。

#define _GNU_SOURCE

... stdlib.h をインクルードする前に、それがプロトタイプ化され、返されることが知られているようにしchar *ます。それ以外の場合、gcc はデフォルトのタイプの を返すと想定しますint_GNU_SOURCEが定義されていない限り、stdlib.h のプロトタイプは表示されません。

以下は、 -Wall が渡された場合、警告なしで問題なく準拠しています。

#include <stdio.h>
#include <limits.h>

#define _GNU_SOURCE
#include <stdlib.h>

int
main(int argc, char *argv[])
{
    char *symlinkpath = argv[1];
    char actualpath [PATH_MAX];
    char *ptr;
    ptr = realpath(symlinkpath, actualpath);
    printf("%s\n", ptr);

    return 0;
}

asprintf() などの他の一般的な拡張機能でも同様の動作が見られます。/usr/include/ を調べて、そのマクロがどれだけオンになり、何が変更されるかを正確に確認する価値があります。

于 2009-10-18T03:43:11.843 に答える
2

コンパイラはそれが何であるかわからないrealpathため、int を返す関数であると想定します。これには歴史的な理由があります。古い C プログラムの多くは、これに依存していました。

#includeたとえば、ヘッダー ファイルを忘れているなど、宣言を見逃している可能性があります。

于 2009-10-18T03:15:51.190 に答える