Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在另一个文件中使用不带结构名称的结构作为外部对象_C_Struct_Extern - Fatal编程技术网

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这

我正在使用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
这样的外部声明不起作用

如果不编辑文件,就无法正确执行此操作;两个不同的未标记结构被认为是不同的类型

在另一个文件中重复结构定义可能“有效”,但这不符合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
var
input
extern
声明需要类型,如果不复制此结构声明,则无法提供该类型(假设您说不想修改此文件时是有意的)(这可能不像看上去那么直截了当;对齐修饰符、打包等)。没有类型信息,您无法简单地
extern
var
input