如何解决使用RegisterWindowMessage时触发的C26426代码分析警告
推荐解决方案:延迟初始化
将全局变量改为函数内的静态变量,仅在首次调用时执行注册逻辑,彻底规避全局初始化顺序风险:
#define UWM_TEST _T("UWM_TEST_{GUID_VALUE_HERE}") UINT GetUwmTestMsg() { // C++11及更高版本保证内部静态变量初始化线程安全,仅执行一次 static const UINT s_uwmTestMsg = ::RegisterWindowMessage(UWM_TEST); return s_uwmTestMsg; }
后续所有需要使用该消息的位置,直接调用GetUwmTestMsg()即可,功能和原有全局变量完全一致,同时消除警告。
可选方案:局部抑制警告(不推荐)
如果你确定当前项目的全局初始化顺序不存在风险,可以临时抑制当前代码行的警告:
#define UWM_TEST _T("UWM_TEST_{GUID_VALUE_HERE}") #pragma warning(push) #pragma warning(disable: 26426) // 仅抑制当前作用域的C26426警告 static const UINT UWM_TEST_MSG = ::RegisterWindowMessage(UWM_TEST); #pragma warning(pop)
该方案没有从根本上解决全局初始化顺序的潜在风险,仅作为临时适配方案使用。
警告原因说明
全局变量的初始化执行时机在程序入口main函数之前,不同编译单元的全局变量初始化顺序没有明确规范,理论上可能出现RegisterWindowMessage依赖的系统运行时组件尚未完成初始化的极端情况,虽然实际运行中大概率不会触发问题,但代码分析工具会基于风险规则抛出该警告。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

