在C中查找数据模型

时间:2012-06-20 20:03:45

标签: c architecture datamodel

假设是安全的:

#if defined(_M_X64) || defined(_M_AMD64) || (defined(_M_IA64) && !defined(__itanuim__))
/* LLP64 Data Model */
#elif defined(__amd64__) || defined(__ia64__) || defined(__ia64) || defined(__itanuim__)
/* LP64 Data Model */
#else
/* 32-bits Data Model(s) */
#endif

适用于Unix,BSD,Windows,Linux和HP?或者我完全错了:-)或遗失了什么?

由于

1 个答案:

答案 0 :(得分:0)

如果您真的没有通过包含文件提供UINT_MAX和Co,则至少可以确定UINTMAX_MAX

typedef unsigned long long uintmax_t;
typedef signed long long intmax_t;

// start testing with the smaller values
#if -1U == 4294967295U
# define UINTMAX_MAX 4294967295
#elif -1U == 18446744073709551615U
...
#endif

预处理器的计算宽度与uintmax_t相同。所以你至少知道架构的那部分。

对于其他事情,我会编写一个测试代码来创建一个小的包含文件:

printf("#define CHAR_IS_SIGNED %d\n", ((char)-1 < 0));
printf("#define UCHAR_MAX %hhu\n", (unsigned char)-1);
printf("#define USHRT_MAX %hu\n", (unsigned short)-1);
printf("#define UINT_MAX %u\n", (unsigned)-1);
printf("#define ULONG_MAX %lu\n", (unsigned long)-1);
printf("#define ULLONG_MAX %llu\n", (unsigned long long)-1);

在合理的假设(二进制补码,无填充位)下,您可以推导出已签名类型的值,并且您还可以为typedef类型执行正确的uintXX_t。< / p>