Linux で完全に動作する C プログラムを作成しましたが、Windows でコンパイルすると、asprintf() が未定義であるというエラーが表示されます。stdio ライブラリの一部である必要がありますが、多くのコンパイラには含まれていないようです。asprintf() 関数を使用できる Windows 用のコンパイラはどれですか? 私は複数のコンパイラを試しましたが、これまでのところそれを定義しているようには見えません。
8 に答える
この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_s
Microsoft 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;
}
これは「移植可能な」書き方ではありませんが、asprintf
Linux + Darwin + Windows をサポートすることが唯一の目的である場合は、これが最善の方法です。
asprintf()
は C 標準関数ではありません。glibc が提供する GNU 拡張機能です。したがって、Linuxで動作します。しかし、他の C 実装ではそれが提供されない場合があります。これは、ライブラリの場合のようです。
代わりに、標準の C 関数malloc()
とを使用してコードを書き直すことができますsnprintf()
。