如何检测DWORD是否是手动定义的

How to detect if DWORD is manually defined?

本文关键字:是否是 定义 DWORD 何检测 检测      更新时间:2023-10-16

我有一个使用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");

编辑:
把我写的代码行添加到项目源代码的某个地方,并尝试编译它。如果它编译了——这可能(只是可能)意味着没有任何类型将它定义给其他人。