解决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

相关文章
相关标签/搜索