我想知道为什么我使用swprintf_s
正在产生
链接器警告warning: implicit declaration of function 'swprintf_s'
我有这个标题:
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <windows.h>
#include <tchar.h>
并且
LPCWSTR foo = L"É %s";
LPCWSTR arg = "bá";
LPCWSTR msg = malloc(wcslen((wchar_t*)foo) + wcslen((wchar_t*)arg) + 1);
swprintf_s(msg, (wchar_t*)foo, (wchar_t*)arg);
我该如何解决这个问题?
答案 0 :(得分:3)
所有_s
个函数(swprintf_s
,memcpy_s
)都是Microsoft的补充。它们是Microsoft的C库的一部分。当您使用GCC时,您将最终使用不同的C库,这不包括Microsoft的添加(但可能包括其自己的添加)。微软将他们的C库称为&#34; CRT&#34;或者&#34; C运行时&#34;,GCC用户将其称为&#34; libc&#34;甚至&#34; glibc&#34; (这是一个具体的实现)。
如果查看Microsoft标准C库(MSDN docs)中的函数列表,请注意相当多的非标准函数。其中大部分都是微软的安全增强功能的一部分&#34; (MSDN docs)。一般来说,我建议避免安全性增强,因为它们是不可移植的,并且它们不是编写安全代码所必需的。
修正:您可以使用swprintf
代替swprintf_s
。 swprintf
函数是C标准的一部分,因此它存在于许多实现中(尽管在非Windows平台上应该避免使用它,因为它使用wchar_t
)。
LPCWSTR foo = L"É %s";
LPCWSTR arg = L"bá";
size_t msgbuflen = wcslen(foo) + wcslen(arg) + 1;
LPCWSTR msg = malloc(len);
if (!msg) error...;
swprintf(msg, msgbuflen, foo, arg);
请注意,LPCWSTR
只是const wchar_t *
的精美typedef,因此您无需将其投射到wchar_t *
。