若是在vc10/11工程的rc文件中有如下任意一行代碼:windows
#include <winuser.h> #include <richedit.h>
那麼vc將會給出一對警告:安全
C:\Program Files\Microsoft Visual Studio 10.0\VC\include\string.h(54): warning RC4011: identifier truncated to '_CRT_SECURE_CPP_OVERLOAD_STANDA' C:\Program Files\Microsoft Visual Studio 10.0\VC\include\string.h(76): warning RC4011: identifier truncated to '_CRT_SECURE_CPP_OVERLOAD_SECURE'
其緣由是vc提供了一個宏_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_MEMORY,用來自動將代碼中的memcpy替換成memcpy_s。
memcpy_s在被提出時,確實感受這樣子代碼是安全了,可是兩個函數的參數不一致,致使修改量上去了,並且移植性也沒有了,因而vc好心地提供這個宏用來自動替換。
那麼爲何會有上面的警告呢?ide
問題出在RC,也就是resource compiler,基於歷史緣由,它會自動將長度超過31的宏截斷,應該是RC只用了char[32]來存諸的緣故,因而咱們就看到讓人不舒服的警告了。函數
解決辦法很簡單:spa
針對#include <winuser.h>,將其替換爲<windows.h>。code
針對#include <richedit.h>,稍微麻煩一點。
據咱們所知,rc包含.h的目的一般只是爲了一些#define,對其中的函數神馬的並不在乎。
那麼如警告中描述所示,問題是出在string.h,同時咱們包含richedit其實也只是爲了獲得RICHEDIT_CLASS,那麼事情好辦了,修改以下:blog
#ifdef RC_INVOKED #define _INC_STRING #endif #include <windows.h> #include <commctrl.h> #include <richedit.h> #include "resource.h"
如MSDN中所描述:string
To conditionally compile your code with the RC compiler, surround code that RC cannot compile with #ifndef RC_INVOKED and #endif.
而string.h中是這樣定義的:it
#pragma once #ifndef _INC_STRING #define _INC_STRING ... #endif
好的,你懂的,我就很少說什麼了。io
:D