如何根据数据大小有条件地编译C代码?

时间:2012-12-07 10:03:37

标签: c

我定义了以下数据类型:

typedef int MyInt;

然后我希望根据MyInt的大小定义一个新的数据类型,类似于下面的代码,但我找不到解决方案。

#if sizeof(MyInt) == 2
    typedef long MyLong;
#else
    typedef short MyLong;
#endif

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:5)

评估sizeof并不是预处理器的工作,这是由编译器完成的,编译器是过程的后期阶段。评估sizeof需要预处理器根本没有的深层C知识。

你可以(理论上)将预处理器视为一个单独的步骤, text only 转换,实际上将“foo.c”转换为“foo-preprocessed.c”。后一个文件不会留下任何#include#if,它们都被预处理器评估和替换。实际的编译器永远不会看到它们。

您应该考虑使用<stdint.h>和已知精度类型(uint16_t和朋友)。

答案 1 :(得分:4)

您可以使用UINT_MAX等宏来确定基础类型的大小。

答案 2 :(得分:1)

您可以使用UINT_MAX - 它可以为您提供有关整数大小的线索。

#if (UINT_MAX <= 65536)
    typedef long MyLong;
#else
    typedef short MyLong;
#endif

答案 3 :(得分:0)

足够新的GCC(我认为4.3)已经预定义了__SIZEOF_LONG__之类的标识符,但是如其他人所建议的那样只使用limits.h中的常量更简单。

答案 4 :(得分:0)

虽然我和C预处理器是死敌,但我们有时需要彼此;)。所以我建议:

#if SIZEOF_MYINT == 2
#   define MYLONG_T long
#elif SIZEOF_MYINT == 4
#   define MYLONG_T short
#endif

typedef MYLONG_T MyLong;

在其他地方(在全局配置头文件中),您的架构依赖于

#define SIZEOF_MYINT 2