1

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

我怎样才能解决这个问题?

4

1 回答 1

3

所有_s函数 ( swprintf_s, memcpy_s) 都是 Microsoft 添加的。它们是 Microsoft 的 C 库的一部分。当您使用 GCC 时,您最终将使用不同的 C 库,它不包括 Microsoft 的添加(但可能包括它自己的添加)。Microsoft 将他们的 C 库称为“CRT”或“C 运行时”,GCC 用户将其称为“libc”甚至“glibc”(这是一个特定的实现)。

如果您查看 Microsoft 标准 C 库(MSDN 文档)中的函数列表,您会发现有相当多的非标准函数。其中大部分是 Microsoft 的“安全增强”(MSDN 文档)的一部分。一般来说,我建议避免安全增强,因为它们是不可移植的,而且它们对于编写安全代码不是必需的。

修复:您可以使用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只是一个花哨的 typedef const wchar_t *,因此您无需将其强制转换为wchar_t *.

于 2012-06-12T18:22:00.237 回答