2012-06-12 163 views
1

我很奇怪,爲什麼我使用的swprintf_s正在生成 連接器警告warning: implicit declaration of function 'swprintf_s'警告的原因是什麼:函數'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); 

我該如何解決這個問題?

+2

hrm。根據[文檔](http://msdn.microsoft.com/en-us/library/ce3zzk1k%28v=vs.80%29.aspx),你應該用'stdio.h'來獲得它。 – pb2q

+0

您使用的是什麼版本的Visual C++? – birryree

+0

@birryree:我正在使用GCC。 – Jack

回答

3

所有的_s函數(swprintf_s,memcpy_s)都是微軟的補充。他們是微軟C庫的一部分。當你使用GCC時,你最終會使用一個不同的C庫,它不包括微軟的補充(但可能包括自己的補充)。微軟將他們的C庫稱爲「CRT」或「C運行時」,GCC用戶稱其爲「libc」或甚至「glibc」(這是一個特定的實現)。

如果你看一下微軟標準C庫(MSDN docs)中的函數列表,你會發現有相當多的非標準函數。其中大部分是微軟「安全增強」(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 *

相關問題