我需要设置 #ifdef
- 检查条件编译。我想自动化该过程但不能指定目标OS /机器。有没有一种方法可以解析预编译器是在32位还是64位上运行?
(解释)我需要定义一个64位大小的类型。在64位操作系统上它是一个很长的,在大多数情况下它是一个很长的。
我找到了this answer - 这是正确的方法吗?
可靠的唯一编译检查是sizeof(void*) == 8
,x64为true,x86为false。这是一个constexpr,您可以将其传递给模板,但您可以忘记使用ifdef。没有与平台无关的方法来了解目标体系结构的地址大小(在预处理时),您需要向IDE询问一个。标准甚至没有地址大小的概念。
没有标准语言支持宏来确定机器在预处理器阶段是64位还是32位。
为了响应您的编辑,有一个“宏 - 少你自己”的方式来获得64位的类型。
如果你需要一个可以容纳64位的类型,那么#include <cstdint>
并使用int64_t
或uint64_t
。你也可以使用the Standard Integer Types provided by Boost。
另一种选择是使用long long
。它在技术上不是C ++标准的一部分(它将在C ++ 0x中),但几乎每个编译器都支持它。
我会看一下跨平台库的源代码。这是一个相当大的部分。每对操作系统和编译器都有自己的一组定义。你可能会看到很少的图书馆:
http://www.libsdl.org/ \include\SDL_config*.h
(少量文件)
http://qt.nokia.com/ \src\corelib\global\qglobal.h
Boost吸收了旧的Predef项目。假设你只关心x86,你会想要architecture macros,更具体地说是BOOST_ARCH_X86_32
/ BOOST_ARCH_X86_64
。
如果您需要更广泛的检测(例如ARM64),请将相关的宏添加到您的支票中,或检查您确实要检查的内容,例如
sizeof(void*) == 8
好吧,答案显然是特定于操作系统,因此您需要缩小您的要求。
例如,在Unix上,uname -a
通常会提供足够的信息来区分操作系统的32位版本和64位版本。
您可以通过预编译器调用该命令。根据其输出,可以适当地设置编译器标志。
我很想把代码中的检测结果提升到Makefile中。然后,您可以利用系统工具来检测和设置您在代码中切换的相应宏。
在你的Makefile中......
<do stuff to detect and set SUPPORT_XX_BIT to the appropriate value>
gcc myFile.c -D$(SUPPORT_XX_BIT) -o myFile
在你的代码中......
#if defined(SUPPORT_32_BIT)
...
#elif defined(SUPPORT_64_BIT)
...
#else
#error "Select either 32 or 64 bit option\n"
#endif
可能最简单的方法可能是比较int
和long long
的大小。你不能在预处理器中做到这一点,但你可以在static_assert
中使用它。
编辑:WoW所有负面投票。我更清楚地说明了我的观点。此外,由于MSVC的工作方式,我似乎应该提到'long long'而不是'long'。