C 在另一个文件中使用不带结构名称的结构作为外部对象
我正在使用xv6,有一个c文件包含以下内容:C 在另一个文件中使用不带结构名称的结构作为外部对象,c,struct,extern,C,Struct,Extern,我正在使用xv6,有一个c文件包含以下内容: struct { struct spinlock lock; char buf[INPUT_BUF]; uint r; // Read index uint w; // Write index uint e; // Edit index } input; 我不想编辑此文件,但我确实想在我制作的另一个文件中使用input。我不知道怎么做,像extern input和extern struct input这
struct {
struct spinlock lock;
char buf[INPUT_BUF];
uint r; // Read index
uint w; // Write index
uint e; // Edit index
} input;
我不想编辑此文件,但我确实想在我制作的另一个文件中使用
input
。我不知道怎么做,像extern input
和extern struct input
这样的外部声明不起作用如果不编辑文件,就无法正确执行此操作;两个不同的未标记结构被认为是不同的类型
在另一个文件中重复结构定义可能“有效”,但这不符合C标准
将此文件更改为struct input{
等,并使另一个文件执行extern struct input{
..}input;
当然,最好放置结构定义(以及它所依赖的任何定义,如
自旋锁
或输入在公共头文件中,这是为了防止ODR冲突。如果不这样做,请非常小心,确保两个文件使用完全相同的结构定义。例如,如果INPUT\u BUF
一个文件与另一个文件不同,则会导致未定义的行为。如果不编辑文件,则无法正确执行此操作;two不同的未标记结构被视为不同的类型
在另一个文件中重复结构定义可能“有效”,但这不符合C标准
将此文件更改为struct input{
等,并使另一个文件执行extern struct input{
..}input;
当然,最好放置结构定义(以及它所依赖的任何定义,如自旋锁
或输入在公共头文件中,这是为了防止ODR冲突。如果不这样做,请非常小心,确保两个文件使用完全相同的结构定义。例如,如果INPUT\u BUF
在一个文件和另一个文件中不同,则会导致未定义的行为。一个extern
声明需要类型,而您不能rovide(假设您说不想修改此文件时是认真的),而不复制此结构声明(这可能不像看起来那么简单;对齐修改器、打包等)。没有类型信息,您无法简单地extern
varinput
。extern
声明需要类型,如果不复制此结构声明,则无法提供该类型(假设您说不想修改此文件时是有意的)(这可能不像看上去那么直截了当;对齐修饰符、打包等)。没有类型信息,您无法简单地extern
varinput
。