Microsoft的< tchar.h>如果_stprintf
已定义,则swprintf
定义为_UNICODE
,如果未定义sprintf
则定义swprintf
。但这些功能有不同的论点!在sprintf
中,第二个参数是缓冲区大小,但_stprintf
没有这个。
_UNICODE
,让他们使用{{1}}?
答案 0 :(得分:5)
你在这里看到平行进化。 swprintf
是标准C的后来者,在发现(A)8位不足以用于文本和(B)你应该传递缓冲区大小和缓冲区之后。 TCHAR
是一个统一ASCII和Unicode API的微软想法。他们丢球,失分(B)。正确的TCHAR
解决方案应该是将_stprintf
定义为swprintf
或snprintf
。
然后解决方案是简单地换<tchar.h>
并自己完成。
答案 1 :(得分:1)
这些函数采用不同的论点!
MS编译器有两种不同的版本。看看here。 这符合ANSI标准。但我认为这不能回答你的问题。我会跳过它一段时间,而不是告诉你如何保持一致性。
让他们使用和不使用_UNICODE吗?
根据MS推荐,最好使用'安全字符串功能'。见this。使用`_stprintf_s',我想你会解决你的问题。
有人蠢蠢欲动吗?
已编辑:我不这么认为。我没有理由为你提供 的答案。当我得到更具体的东西时,我会发布更新。在此期间,请查看MSalters的解释。
奇怪的是MS的C运行时 does not 声称与ISO标准的兼容性。
免责声明:我不是在为雷蒙德的巨人辩护,只是指出让我感到奇怪的东西!
答案 2 :(得分:0)
这可能无法直接回答问题,但另一种方法是使用_stprintf_s
。你必须添加额外的parm,但它仍然会以两种方式编译,并且更具有前瞻性。