如何检测DWORD是否是手动定义的
How to detect if DWORD is manually defined?
我有一个使用DWORD
s的C++项目。我的问题是,我不知道如何检查DWORD
是否是标准的Windows DWORD
类型,或者用户是否手动将其定义为其他类型,比如int
。
我该如何检查?
问题出在我有兴趣检查的目标机器上——我无法运行Visual Studio。我只能运行一些.exe文件。
在我的机器上,当我使用"转到定义"时,它显示为unsigned long
。如何解决这个问题?检查这个DWORD指的是目标机器上的哪种类型?
更新:当项目在某台机器上编译时,似乎只对哪种类型的DWORD进行定义很重要——我没有访问该机器的权限,我只有项目源,它可能没有改变。
DWORD
的#define
作为unsigned long
是编译器在编译时创建二进制可执行文件时进行的检查。这个二进制文件在每台运行它的机器上都是相同的。如果编译器决定在为DWORD保留空间时需要分配4、8或100个字节,它将在运行的每台电脑上分配相同数量的字节。
这个问题一开始看起来很傻,但它包含了一些有趣的轶事。许多开发人员从托管世界进入原生世界,诸如"在不同的处理器/OS上重要吗"之类的事情乍一看并不清楚。
因此,如果您正在运送可执行文件,这并不重要。在编译代码之后,代码转换为不可变的机器语言,其中DWORD
保持编译时定义的状态。如果它是unsigned long
,那么它在每台可以运行可执行文件的机器上都是这样。
但是,如果我们推出库,会发生什么?突然间,事情变得重要了
在这种情况下(不是您的),您可以使用std::is_same
:
static_assert(std::is_same<DWORD,unsigned long>::value,"DWORD is not unsigned long, fail to compile");
编辑:
把我写的代码行添加到项目源代码的某个地方,并尝试编译它。如果它编译了——这可能(只是可能)意味着没有任何类型将它定义给其他人。
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 如何检测是否例如.T::is_transparent 是定义的?
- 是否是从等待返回到悬而未决的"this"实例的未定义行为?
- 与auto_ptr声明不同,当unique_ptr声明的模板类型不完整时,它是否是明确定义的?
- 取消引用悬空指针是否是未定义的行为
- 取消引用等于 nullptr 的指针是否是标准的未定义行为?
- 对内联函数有不同的定义是否是一种未定义的行为
- 取消引用无效指针但不使用结果是否是C++中的未定义行为
- 在排序时更改排序顺序是否是未定义的行为
- 当您将引用返回到局部变量时,它是否是一种未定义的行为
- 我可以对临时使用右值引用吗?是否是未定义的行为
- 这是否是 C++ 中的有效 2D 数组定义
- 当程序执行取决于执行顺序时,是否是未定义的行为
- 在 CPP 文件中使用命名空间作为函数定义的前缀是否是一种好的做法
- 当我们定义模板时,始终定义“value_type”是否是一种好的做法
- 是否应该定义静态constexpr类成员变量,即使它们不是ODR使用的
- 如何检测DWORD是否是手动定义的
- 如何检查类型是否是 int 的类型定义
- 为将来的'unset'变量定义外部变量是否是一种好的做法?
- C++ 我知道数组长度,但想知道是否是一种更简洁的数组元素定义方法