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_smemcpy_s) は Microsoft の追加です。これらは Microsoft の C ライブラリの一部です。GCC を使用すると、別の C ライブラリを使用することになります。これには、Microsoft の追加機能は含まれていません (ただし、独自の追加機能が含まれている場合があります)。Microsoft は C ライブラリを「CRT」または「C ラン​​タイム」と呼び、GCC ユーザーはそれを「libc」または「glibc」(特定の実装) と呼んでいます。

Microsoft の標準 C ライブラリ ( MSDN docs )の関数の一覧を見ると、かなり多くの非標準関数が含まれていることがわかります。これらのほとんどは、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 に答える