一个结构可能包含的成员数量或变量类型是否有大小限制?
Is there a size limit to how many members or the type types of variables a structure may contain?
当我将包含结构化元数据的数组大小从大小 [2] 增加到 [27] 时,我 运行 遇到了一些奇怪的问题(在编译时)与我的嵌入式 C 代码。所以很明显,这是一个嵌套结构化风格的程序,而不是我的原创作品!
我记得在汇编代码指令中,曾经有一个JMP FAR,JMP NEAR/SHORT.. 结构上有没有这样的限制(显然没有结构中的跳转)。是否存在编译器无法为结构分配连续内存块的情况,因为它存在限制并在编译期间失败。
一些线索:我记得的修复是将成员(数组成员)从 原始结构 移动到另一个 嵌套结构 。这就是为什么我推断可能存在限制的原因。
//STRUCTURES
typedef UINT8 P_Name_t[5];
typedef UINT8 ChipSN_t[3];
typedef struct
{
ChipSN_t ChipSN;
<other members>
} ChipIdent_t;
typedef struct Data_t
{
ChipIdent_t ReadOnlyMemID;
<other members>
} Data_t;
typedef struct
{
P_Name_t NameOfPart;
<other members>
} Log_t;
Data_t Data_Src;
typedef struct
{
P_Name_t NameOfPart;
ChipSN_t ChipSN;
}PartNum_ID_t;
typedef struct
{
PartNum_ID_t PN_ChipID[27];
<other members>;
}
按照标准,有一个限制;但限制远不止你在这里提到的大小。 C89和C99标准有1023个结构成员的限制。请参阅标准中的以下文本。
5.2.4.1 Translation limits
— 1023 members in a single structure or union
看起来如果您的代码是正确的并且限制为 1023 个结构成员,那么您使用的编译器可能有限制。
您的编译器可以为单个结构处理的结构元素数量可能确实存在限制,但正如 MCG 从 C 标准中引用的那样,对于兼容的编译器,此限制必须至少为 1023,并且大多数编译器具有更高的限制或根本没有实际限制。
我怀疑问题出在其他地方:
您的项目的 Makefile 可能对具有结构定义的头文件具有不完整的依赖性:使用不同定义编译的模块将不兼容并产生未定义的行为。删除所有目标文件并重新编译项目。
一些汇编模块可能依赖于原来的结构布局:改变定义只会影响重新编译的C模块。
一些库模块或OS系统调用可能依赖于原始布局。可能需要重新编译所有库甚至修补 OS。
某些功能可能依赖于原始布局并使用强制转换通过另一种类型访问某些结构。改变布局可能会破坏这样的代码,无论如何它都很脆弱,因为即使改变编译器也可能产生类似的问题。
也有可能某些类型在不同的模块中被多次定义。这是一种糟糕且非常容易出错的编码风格,因为仅更改其中一个定义将在对象模块链接在一起时导致未定义的行为。
当我将包含结构化元数据的数组大小从大小 [2] 增加到 [27] 时,我 运行 遇到了一些奇怪的问题(在编译时)与我的嵌入式 C 代码。所以很明显,这是一个嵌套结构化风格的程序,而不是我的原创作品!
我记得在汇编代码指令中,曾经有一个JMP FAR,JMP NEAR/SHORT.. 结构上有没有这样的限制(显然没有结构中的跳转)。是否存在编译器无法为结构分配连续内存块的情况,因为它存在限制并在编译期间失败。
一些线索:我记得的修复是将成员(数组成员)从 原始结构 移动到另一个 嵌套结构 。这就是为什么我推断可能存在限制的原因。
//STRUCTURES
typedef UINT8 P_Name_t[5];
typedef UINT8 ChipSN_t[3];
typedef struct
{
ChipSN_t ChipSN;
<other members>
} ChipIdent_t;
typedef struct Data_t
{
ChipIdent_t ReadOnlyMemID;
<other members>
} Data_t;
typedef struct
{
P_Name_t NameOfPart;
<other members>
} Log_t;
Data_t Data_Src;
typedef struct
{
P_Name_t NameOfPart;
ChipSN_t ChipSN;
}PartNum_ID_t;
typedef struct
{
PartNum_ID_t PN_ChipID[27];
<other members>;
}
按照标准,有一个限制;但限制远不止你在这里提到的大小。 C89和C99标准有1023个结构成员的限制。请参阅标准中的以下文本。
5.2.4.1 Translation limits
— 1023 members in a single structure or union
看起来如果您的代码是正确的并且限制为 1023 个结构成员,那么您使用的编译器可能有限制。
您的编译器可以为单个结构处理的结构元素数量可能确实存在限制,但正如 MCG 从 C 标准中引用的那样,对于兼容的编译器,此限制必须至少为 1023,并且大多数编译器具有更高的限制或根本没有实际限制。
我怀疑问题出在其他地方:
您的项目的 Makefile 可能对具有结构定义的头文件具有不完整的依赖性:使用不同定义编译的模块将不兼容并产生未定义的行为。删除所有目标文件并重新编译项目。
一些汇编模块可能依赖于原来的结构布局:改变定义只会影响重新编译的C模块。
一些库模块或OS系统调用可能依赖于原始布局。可能需要重新编译所有库甚至修补 OS。
某些功能可能依赖于原始布局并使用强制转换通过另一种类型访问某些结构。改变布局可能会破坏这样的代码,无论如何它都很脆弱,因为即使改变编译器也可能产生类似的问题。
也有可能某些类型在不同的模块中被多次定义。这是一种糟糕且非常容易出错的编码风格,因为仅更改其中一个定义将在对象模块链接在一起时导致未定义的行为。