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