10

Linux で完全に動作する C プログラムを作成しましたが、Windows でコンパイルすると、asprintf() が未定義であるというエラーが表示されます。stdio ライブラリの一部である必要がありますが、多くのコンパイラには含まれていないようです。asprintf() 関数を使用できる Windows 用のコンパイラはどれですか? 私は複数のコンパイラを試しましたが、これまでのところそれを定義しているようには見えません。

4

8 に答える 8

19

このasprintf()関数は C 言語の一部ではなく、すべてのプラットフォームで使用できるわけではありません。Linux にそれがあるという事実は異常です。

_vscprintfと を使用して独自に記述できます_vsprintf_s

int vasprintf(char **strp, const char *fmt, va_list ap) {
    // _vscprintf tells you how big the buffer needs to be
    int len = _vscprintf(fmt, ap);
    if (len == -1) {
        return -1;
    }
    size_t size = (size_t)len + 1;
    char *str = malloc(size);
    if (!str) {
        return -1;
    }
    // _vsprintf_s is the "secure" version of vsprintf
    int r = _vsprintf_s(str, len + 1, fmt, ap);
    if (r == -1) {
        free(str);
        return -1;
    }
    *strp = str;
    return r;
}

vasprintfこれはメモリからのものですが、Visual Studio ランタイムの記述方法に非常に近いはずです。

との使用は_vscprintf_vsprintf_sMicrosoft C ランタイムに固有の奇妙な点です。Linux や OS X では、この方法でコードを作成することはありません。_s特に、バージョンは標準化されていますが、実際には Microsoft エコシステムの外で遭遇することはあまりなく、そうではあり_vscprintfません。他の場所にも存在します。

もちろん、asprintf単なるラッパーvasprintfです:

int asprintf(char **strp, const char *fmt, ...) {
    va_list ap;
    va_start(ap, fmt);
    int r = vasprintf(strp, fmt, ap);
    va_end(ap);
    return r;
}

これは「移植可能な」書き方ではありませんが、asprintfLinux + Darwin + Windows をサポートすることが唯一の目的である場合は、これが最善の方法です。

于 2016-10-20T16:42:42.913 に答える
3

asprintf()は C 標準関数ではありません。glibc が提供する GNU 拡張機能です。したがって、Linuxで動作します。しかし、他の C 実装ではそれが提供されない場合があります。これは、ライブラリの場合のようです。

代わりに、標準の C 関数malloc()とを使用してコードを書き直すことができますsnprintf()

于 2016-10-20T16:39:30.380 に答える