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