Visual C的strdupa()实现

Visual C的strdupa()实现,c,visual-studio,gcc,alloca,C,Visual Studio,Gcc,Alloca,我正在尝试将一个C(不是C++)程序从GCC移植到VisualStudio GCC特定函数strdupa()在该程序中广泛使用。 有没有办法为Visual C实现此功能 另外,我知道它使用alloca()并且不安全。但它现在在GCC上运行得非常好,我认为在一个地方实现相同的函数然后更改程序逻辑更安全。我也不希望性能下降。我将它作为一个宏来实现: #define strdupa(a) strcpy((char*)alloca(strlen(a) + 1), a) 这样,它就不在函数中,因此不会过

我正在尝试将一个C(不是C++)程序从GCC移植到VisualStudio

GCC特定函数strdupa()在该程序中广泛使用。 有没有办法为Visual C实现此功能


另外,我知道它使用alloca()并且不安全。但它现在在GCC上运行得非常好,我认为在一个地方实现相同的函数然后更改程序逻辑更安全。我也不希望性能下降。

我将它作为一个宏来实现:

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

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

我将它实现为宏:

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

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

我将其作为函数实现的方法。不确定它是否安全,但它似乎有效:

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

但我认为宏是一种比使用forceinline更好的方法,我用它来实现函数。不确定它是否安全,但它似乎有效:

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

但是我认为它比使用uu forceinline

好,根据,有一个函数相当于
alloca()
,你可以用它来实现你自己的
strdupa()
。但是,它被标记为已弃用,并且建议的替换行为与此不同(它可能在堆栈或堆上分配,因此需要调用自由函数,因此它不是一次性替换)@FelixG我知道visual c有自己的alloca等价物,但如何实现strdupa()?如何避免从自己的strdupa()实现返回时释放内存?我建议创建一个宏。宏可以在本地堆栈上分配空间。它应该作为一个内联函数工作(对于使用本地堆栈的
strdupa
也应该是这样)。根据,有一个函数相当于
alloca()
,您可以使用它来实现自己的
strdupa()
。但是,它被标记为已弃用,并且建议的替换行为与此不同(它可能在堆栈或堆上分配,因此需要调用自由函数,因此它不是一次性替换)@FelixG我知道visual c有自己的alloca等价物,但如何实现strdupa()?如何避免从自己的strdupa()实现返回时释放内存?我建议创建一个宏。宏可以在本地堆栈上分配空间。它应该作为一个内联函数工作(对于使用本地堆栈的strdupa来说也是如此)。我会用它!但我只是好奇,是否有任何方法将其实现为函数?@Sandro是的,你可以这样做,但这意味着很多特定于平台的东西,包括汇编代码。请看
alloca
的源代码,它可以在您计算机上安装的Windows SDK中找到。@Sandro还有一个有趣的信息:是的,我认为这就是解决方案。我会用它!但我只是好奇,是否有任何方法将其实现为函数?@Sandro是的,你可以这样做,但这意味着很多特定于平台的东西,包括汇编代码。请查看
alloca
的源代码,该源代码可在您计算机上安装的Windows SDK中找到。@Sandro还提供了一些有趣的信息: