c - 在 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。...感谢您的任何想法!
解决方案
您可以声明所有结构的联合
union allstructs {
struct s00 s00val;
struct s01 s01val;
/* ... */
struct s99 s99val;
}
并获得联合体的大小
sizeof(union allstructs)
当您想通过网络传输结构时,您还应该考虑结构的打包/填充、字节顺序和浮点实现。
推荐阅读
- javascript - 如何使用 jQuery 禁用和显示 div?
- angular - NgModuleFactoryLoader.load() 找不到模块
- android - 使用 NavController 导航到多个首选项屏幕时设置工具栏/应用程序栏
- javascript - 在 forEach 循环期间跳过第一次迭代
- css - 不要在 scrapy 中加载图像、css 或主题以及脚本
- asp.net-mvc - 在新项目上安装 aspent 样板包得到错误
- trace - 带有 Spring Boot 的 Jaeger
- microsoft-cognitive - Microsoft 自定义语音 - 人工标记的转录
- javascript - 价格滑块,添加实时价格更新(文本)
- javascript - 在渲染组件之前反应路由器闪烁