我编写了一个可以在Linux上完美运行的C程序,但是当我在Windows上对其进行编译时,它给我一个错误,指出asprintf()是未定义的。它应该是stdio库的一部分,但似乎许多编译器都不包含它。我可以在Windows上使用哪个编译器,以便允许我使用asprintf()函数?我尝试了多种编译器,到目前为止,似乎都没有定义它。

最佳答案

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;
}

这是从内存中获取的,但是它应该与您为Visual Studio运行时编写vasprintf的方式非常接近。
_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,那么这是最好的方法。

09-04 15:42