未定义外部结构体的使用规范及相关技术问题咨询
C结构体跨编译单元使用问题解答
代码示例
file2.c
struct myStruct { int a; } A;
file1.c
extern struct myStruct A; int main (void) { }
编译命令:gcc file1.c file2.c
问题解答
合法。这种用法完全符合C标准,和标准库中
FILE*的设计逻辑一致:只要不直接访问结构体内部成员,仅做变量引用、传递给函数等操作,只需要结构体的不完全类型声明(struct myStruct)就够了。编译器只需要确认这是一个结构体类型,无需知晓内部细节就能处理外部变量的声明与引用。是的。只有当你需要操作结构体内部成员(比如
A.a = 5;)、计算结构体大小(sizeof(struct myStruct))、执行结构体拷贝等操作时,才必须提供完整的结构体定义。如果仅作为外部变量引用、传递或用指针操作,不完全类型声明足以满足需求。不符合标准规范。C标准明确要求,同一标识符对应的结构体类型,在所有引用它的编译单元中必须有兼容的定义。若不同编译单元中结构体定义不一致(比如一个含
int a,另一个含char b),属于未定义行为——编译器可能不会报错,但运行时会出现不可预测的问题(如内存访问错误、数据错乱),绝对要避免这种情况。
内容的提问来源于stack exchange,提问作者user129393192
相关产品推荐
相关产品推荐

