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
更好
我正在尝试将 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 byalloca()
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 isfoo(x, alloca(4), y)
.
我将其实现为功能的方式。不确定它是否安全,但似乎有效:
__forceinline char* strdupa(const char* s) {
return strcpy((char*)_alloca(strlen(s) + 1), s);
}
但我认为使用宏比使用 __forceinline
更好