Visual C 的 strdupa() 实现

Posted

技术标签:

【中文标题】Visual C 的 strdupa() 实现【英文标题】:strdupa() implementation for Visual C 【发布时间】:2020-11-11 21:23:51 【问题描述】:

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

GCC 特有的函数 strdupa() 在这个程序中被广泛使用。 有没有办法为 Visual C 实现这个功能。

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

【问题讨论】:

嗯,根据the documentation,有一个等效于alloca()的函数,你可以用它来实现你自己的strdupa()。但是,它被标记为已弃用,并且建议的替换的行为方式不同(它可能在堆栈或堆上分配,因此需要调用空闲函数,因此它不是直接替换) @FelixG 我知道visual c有它自己的alloca等价物,但是如何实现strdupa()?当我从自己的 strdupa() 实现返回时如何避免释放内存? 我建议创建一个宏。该宏可以在本地堆栈上分配空间。它应该作为内联函数工作(strdupa 也应该使用本地堆栈)。 【参考方案1】:

我会将它实现为宏:

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

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

【讨论】:

是的,我认为这就是解决方案。我会用的!但我只是好奇,是否有任何方法可以将其实现为函数? @Sandro 是的,你可以这样做,但这意味着很多平台特定的东西,包括汇编代码。查看alloca 的源代码,它可以在您计算机上安装的 Windows SDK 的某处找到。 @Sandro 还有有趣的信息:***.com/a/33728005/898348【参考方案2】:

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

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

但我认为宏是比使用 __forceinline 更好的方法

【讨论】:

以上是关于Visual C 的 strdupa() 实现的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 fftw3 Visual Studio 2010 的 openCV 的链接器错误

vi 提示visual模式,不能使用鼠标粘贴复制问题

json visual studio vi map esc设置

Visual C++(MFC)实现C/S

ex命令

visual studio code主要用来写啥语言