我想在一个需要能够在linux和windows中编译的C程序中使用这个函数。 起初,我尝试使用strtok_r,但后来当我在windows上编译,它抱怨函数不存在,并表示它会认为它是一个外部函数,但然后失败。 然后我用strtok_s编译! 然后我尝试在linux上,但现在抱怨有一个“未定义的参考'strtok_s'”。
是唯一的windowsfunction,另一个linux的function? 我能做些什么来使它在两个编译?
install_github(“bmschmIDt / wordVectors”)
gcc -fdiagnostics-color在windows上工作吗?
错误:EPERM: *** 作不允许
如何让gcc跳过错误,但仍然输出它们。
fprintf,错误:格式不是string文字,也没有格式参数[-Werror = format-security
这两个函数都是非常丑陋的,不直观的解析字符串的习惯用法,通常不能以微妙的方式满足特定应用程序的需求。 甚至在标准C中的普通strtok 。只要把它们扔出来,编写自己的代码遍历char数组,并根据需要分解。 strchr , strspn和strcspn可以帮助你做到这一点,或者你可以从头开始在数组上工作。
strtok_s只是strtok_s的windows版本,在其他地方是标准的。
一个(通常我会想)的方式来使程序可移植,当涉及到像strtok_s / strtok_r函数是使用预处理器:
#if defined(_WIN32) || defined(_WIN64) /* We are on windows */ # define strtok_r strtok_s #endif
由于原型和功能是相同的,现在只能使用strtok_r 。
我没有足够的信誉评论其他答案,所以我将不得不提供我自己的。
为了解决这个问题:
“strtok_s是windows上strtok的缓冲区溢出安全版本,windows上的标准strtok是线程安全的…”
这不是真的。 strtok_s是MSVC编译器的线程安全版本。 strtok不是线程安全的!
为了解决这个问题:
“如果在cygwin上编译,它会报告自己是windows,但是已经定义了strtok_r这样的posix接口。
再次,不是真的。 不同的是你使用的编译器。 当使用Microsoft的Visual C ++编译器MSVC时,函数是strtok_s。 另一个编译器,比如GNU编译器集合GCC,可以使用不同的标准库实现,比如strtok_r。 在识别使用哪个函数时,请考虑编译器,而不是目标平台。
在我看来,Joachim Pileborg的答案是本页最好的答案。 但是,它需要一个小的编辑:
#if defined(_WIN32) /* || defined(_WIN64) */ #define strtok_r strtok_s #endif
_WIN32和_WIN64都是MSVC编译器提供的预定义宏。 编译64位目标时定义_WIN64。 _WIN32被定义为32和64位目标。 这是微软为向后兼容而做出的妥协。 _WIN32被创建来指定Win32 API。 现在您应该考虑_WIN32指定windows API – 它不是特定于32位目标。
strtok_r是POSIX系统上strtok的线程安全版本
strtok_s是windows上的strtok的缓冲区溢出安全版本。 窗口上的标准strtok是线程安全的,所以strtok_s应该是。
只是为了澄清。 strtok在windows中是线程安全的。 strtok使用TLS变量来维护每个线程的最后一个指针。 但是,您不能使用strtok将访问权限交叉到每个线程的多个标记字符串。 strtok_r和strtok_s都通过允许用户通过第三个参数来维护上下文来解决这个交织问题。 希望这可以帮助。
总结以上是内存溢出为你收集整理的在C中strtok_r和strtok_s有什么区别?全部内容,希望文章能够帮你解决在C中strtok_r和strtok_s有什么区别?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)