首页 > 解决方案 > 在 C 中编译时查找 100 个结构的最大大小

问题描述

我有 100 个结构,看起来像这样:

struct s00 { char   data[30]; };
struct s01 { char   data[30]; };
struct s02 { int    data[10]; };
struct s03 { double data[5];  };
struct s04 { float  data[20]; };
struct s05 { short  data[15]; };
struct s06 { char   data[7];  };
struct s07 { int    data[19]; };
struct s08 { double data[11]; };
struct s09 { float  data[5];  };
struct s10 { char   data[52]; };
//...
struct s99 { char   data[12]; };

typedef struct s00 s00;
typedef struct s01 s01;
typedef struct s02 s02;
//...
typedef struct s99 s99;

我想sizeof在编译时从这些结构中找到最大的。我尝试使用这样的比较宏:

 #define LARGER(a, b) ((a) > (b) ? (a) : (b))

然后用它来构造包含结果的最终定义:

#define MAX_SIZEOF (LARGER(sizeof(s00), \
                    LARGER(sizeof(s01), \
                    LARGER(sizeof(s02), \
                    LARGER(sizeof(s03), \
                    LARGER(sizeof(s04), \
                    LARGER(sizeof(s05), \
                    LARGER(sizeof(s06), \
                    LARGER(sizeof(s07), \
                    LARGER(sizeof(s08), \
                    LARGER(sizeof(s09), \
                    LARGER(sizeof(s10), \
                    //...
                    sizeof(s99))) /*...*/ ))

但是,编译器空间不足:

错误 C1060 编译器堆空间不足

这是有道理的,因为它#define必须跟踪很多数字,因为它只是替换文本。具体来说,在 中找到的整数个数MAX_SIZEOF是指数的,可以描述为:

数字的数量

其中 x 等于所涉及的结构的数量。假设一个整数有 4 个字节,编译器需要分配 30.4 兆兆兆字节来计算这个宏(如果我的计算是正确的)。我的系统最多可以处理 17 个结构(786430 个数字,3.14 兆字节)。

我不确定如何在 C 中找到有效的解决方案。

在 C++ 中,我可以constexpr很容易地实现这一点,而不会出现任何编译问题:

constexpr size_t LARGER(size_t a, size_t b) {
    return a > b ? a : b;
}
constexpr size_t MAX_SIZEOF() {
return 
    LARGER(sizeof(s00), \
    LARGER(sizeof(s01), \
    LARGER(sizeof(s02), \
    LARGER(sizeof(s03), \
    LARGER(sizeof(s04), \
    LARGER(sizeof(s05), \
    LARGER(sizeof(s06), \
    LARGER(sizeof(s07), \
    LARGER(sizeof(s08), \
    LARGER(sizeof(s09), \
    LARGER(sizeof(s10), \
    //...
    sizeof(s99))/*...*/)));

但是,是的,我只能在这里使用 C。...感谢您的任何想法!

标签: calgorithmmacrospreprocessor

解决方案


您可以声明所有结构的联合

union allstructs {
    struct s00 s00val;
    struct s01 s01val;
    /* ... */
    struct s99 s99val;
}

并获得联合体的大小

sizeof(union allstructs)

当您想通过网络传输结构时,您还应该考虑结构的打包/填充、字节顺序和浮点实现。


推荐阅读