警告的原因是什么:函数'swprintf_s'的隐式声明?

时间:2012-06-12 16:25:26

标签: c wchar-t

我想知道为什么我使用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);

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

所有_s个函数(swprintf_smemcpy_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_sswprintf函数是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 *