X 平台可重入 wcstok()?
现在我正在寻找 GCC 和其他编译器(如果有的话)已知的 wcstok()
的可重入版本。
到目前为止,我使用 wcstok_s()
但那只是 MSVC,我还需要在其他平台上编译代码。虽然有些页面建议使用 wcstok_r()
,但我在 GCC 标头中找不到它。其他(手册)页面提到 strtok_s()
没有特定的宽字符版本,但提到据说它仅用于多字节字符串(?)。
所以,我愿意接受建议。编写我自己的包装器/版本只是最后的解决方案。
编辑阿舍普勒: 由于参数太多
而无法编译的示例代码 - 尽管毫无意义,但应该编译:
#include <cwchar> // includes wchar.h as well
int main(void)
{
wchar_t *a, *b, *c;
wcstok(a, b, &c);
return 0;
}
Right now I'm looking for a reentrant version of wcstok()
that is known by GCC and other compilers (if there's any).
So far I use wcstok_s()
but that one is MSVC only and I need to compile the code on other platforms as well. While some pages suggest wcstok_r()
I couldn't find it in my GCC headers. Other (man)pages mention strtok_s()
without a specific wide char version but mention it's said to be used for for multibyte strings only(?).
So, I'm open for suggestions. Writing my own wrapper/version would be a last way out solution only.
Edit for aschepler:
Sample code that doesn't compile due to too many arguments
- should compile despite being pointless:
#include <cwchar> // includes wchar.h as well
int main(void)
{
wchar_t *a, *b, *c;
wcstok(a, b, &c);
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
C89(因此也是 C++)指定的函数
wcstok
是可重入的,并且与 Microsoft 的wcstok_s
具有相同的签名和基本相同的行为。wcstok
应在
和/或
中声明。但看起来 Microsoft 的
wcstok
签名不正确。因此,如果您在 Windows 上使用 gcc 时遇到此问题,也许您可以使用
#ifdef _WINDOWS
(而不是#ifdef _MSC_VER
)来确定使用哪个函数。The function
wcstok
specified by C89 (and therefore C++) is reentrant and has the same signature and essentially the same behavior as Microsoft'swcstok_s
.wcstok
should be declared in<wchar.h>
and/or<cwchar>
.But it looks like Microsoft's
wcstok
has an incorrect signature.So maybe you can use
#ifdef _WINDOWS
(rather than#ifdef _MSC_VER
) to determine which function to use, if you run into this problem even using gcc on Windows.