Visual C 的 strdupa() 实现

strdupa() implementation for Visual C

我正在尝试将 C(不是 C++)程序从 GCC 移植到 Visual Studio。

GCC 特定函数 strdupa() 在该程序中被广泛使用。 有什么办法可以为Visual C实现这个功能吗

PS。我知道它使用 alloca() 并且它是不安全的。但它现在在 GCC 上工作得很好,我认为在一个地方实现相同的功能然后改变程序的逻辑更安全。我也不希望性能下降。

我会将其实现为宏:

#define strdupa(a) strcpy((char*)alloca(strlen(a) + 1), a)

这样它就不会在函数中,因此不会过早释放分配的字符串。


注: 来自man

On many systems alloca() cannot be used inside the list of arguments of a function call, because the stack space reserved by alloca() would appear on the stack in the middle of the space for the function arguments.

…即(来自“GNU C Library Reference Manual”):

Do not use alloca inside the arguments of a function call—you will get unpredictable results, … . An example of what to avoid is foo(x, alloca(4), y).

我将其实现为功能的方式。不确定它是否安全,但似乎有效:

__forceinline char* strdupa(const char* s) {
    return strcpy((char*)_alloca(strlen(s) + 1), s);
}

但我认为使用宏比使用 __forceinline

更好