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 的链接器错误