Boost stacktrace:自定义INPUT类与Windows内部类命名冲突解决办法
Windows MSVC下自定义INPUT类与WinUser.h同名冲突的解决办法
除了重命名自定义类,还有以下几种实用方案:
1. 给自定义类套上专属命名空间
把你的INPUT类放到自己的命名空间里,彻底和全局命名空间里Windows的INPUT结构体划清界限:
#include <iostream> #include <boost/stacktrace.hpp> namespace MyOwnNS { class INPUT { int xyz; }; } void function() { std::cout << boost::stacktrace::stacktrace(); } int main() { // 使用自定义类时加上命名空间前缀 MyOwnNS::INPUT myInput; function(); }
之后只要通过命名空间限定访问,就不会再出现命名冲突。
2. 禁用Windows头文件里的INPUT定义
如果你的代码完全用不到Windows原生的INPUT结构体,可以在引入任何头文件之前定义一个预处理宏,让WinUser.h跳过该结构体的声明:
// 这个宏必须写在所有头文件包含语句的最前面 #define NOINPUT #include <iostream> #include <boost/stacktrace.hpp> class INPUT { int xyz; }; void function() { std::cout << boost::stacktrace::stacktrace(); } int main() { INPUT myInput; function(); }
注意:要是后续代码需要用到Windows的INPUT,这种方法就不能用了,得提前考虑清楚。
3. 用全局命名空间区分两种类型
如果代码里既要用自定义的INPUT,又要保留Windows原生的INPUT,可以在使用Windows版本时加上全局命名空间的前缀:::
#include <iostream> #include <boost/stacktrace.hpp> class INPUT { int xyz; }; void function() { std::cout << boost::stacktrace::stacktrace(); } int main() { // 直接用就是自定义的INPUT INPUT myInput; // 加::就是Windows原生的INPUT ::INPUT winInput; function(); }
这种方法不用修改类的定义,只需要在区分类型时加个前缀就行,灵活度很高。
内容的提问来源于stack exchange,提问作者Tryer
相关产品推荐
相关产品推荐

