2014-09-16 2 views
1

Я работаю с xv6 и есть ас-файл, который содержит следующее:Использование структуры без имени структуры, как экстерн в другом файл

struct { 
    struct spinlock lock; 
    char buf[INPUT_BUF]; 
    uint r; // Read index 
    uint w; // Write index 
    uint e; // Edit index 
} input; 

Я не хочу, чтобы редактировать этот файл, но я хочу использовать input в другом файле, который я сделал. Я не уверен, как это сделать, внешние объявления вроде extern input и не работают

+0

Объявление 'extern' требует типа, который вы не можете предоставить (если вы имели в виду, когда вы сказали, что не хотите изменять этот файл), не реплицируя это объявление структуры (и это может быть не так прямолинейно, как это похоже, модификаторы выравнивания, упаковка и т. д.). Вы не можете просто «extern» var 'input' без информации о типе. – WhozCraig

ответ

4

Невозможно сделать это правильно, не редактируя файл; две разные немаркированные структуры считаются разными типами.

Он может «работать», чтобы повторить определение структуры в другом файле, но это не соответствует стандарту C.

Изменить этот файл на struct input_t { и т. Д. И сделать другой файл extern struct input_t { ... } input;.

Конечно, желательно размещать определение структуры (и любые определения, на которые он опирается, например, spinlock или INPUT_BUF) в общий заголовочный файл, что предотвращает нарушения ODR. Если вы этого не сделаете, будьте очень осторожны, чтобы оба файла использовали то же самое определение структуры. Например, если INPUT_BUF были разными в одном, то это приведет к неопределенному поведению.

+0

Если нет другого способа, я просто назову его, спасибо – asimes

 Смежные вопросы

  • Нет связанных вопросов^_^