解決Visual Studio 2010/2012的RC4011 warnings

若是在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

相關文章
相關標籤/搜索