|
Как сослаться на структуру typedef struct?, Из другого файла |
|
|
|
Jun 20 2017, 09:27
|
Знающий
   
Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247

|
В одном хидере объявлена структура: Код typedef struct ADC_my2 { //Структура для хранения сырых значений uint16_t ADC_CH0; // uint16_t ADC_CH1; // uint16_t ADC_CH2; // uint16_t ADC_CH3; // uint16_t ADC_CH4; // uint16_t ADC_CH5; // uint16_t ADC_CH6; // uint16_t ADC_CH7; // }ADC_my; // ADC_my ADC_RAW; // Для того, чтобы были доступны ее элементы из другого файла нажно в его хидере объявить эту структуру как extern. Если я правильно понимаю. Как это сделать?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jun 20 2017, 09:29
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
В хидеое должно быть так: extern ADC_my ADC_RAW; И только в одном из файлов должна быть еще такая строка: ADC_my ADC_RAW Цитата Как это сделать любым текстовым редактором.
Сообщение отредактировал Genadi Zawidowski - Jun 20 2017, 09:31
|
|
|
|
|
Jun 20 2017, 09:37
|
Знающий
   
Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247

|
Не получается однако. Я так уже пробовал. Потому и спросил. Код ../Src/stm32l1xx_it.c(91): error: #20: identifier "ADC_my" is undefined
|
|
|
|
|
Jun 20 2017, 09:40
|
Знающий
   
Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450

|
Цитата(Димон Безпарольный @ Jun 20 2017, 13:37)  Не получается однако. Я так уже пробовал. Потому и спросил. Код ../Src/stm32l1xx_it.c(91): error: #20: identifier "ADC_my" is undefined что-то Вы умалчиваете. В хедере должно быть объявление типа структуры и extern объявление переменной. Этот хедер должен подключаться во все файлы, где используется эта структура. В одном из файлов должна быть размещена эта струкутра, т.е. объявление переменной без extern, хедер этому мешать не будет.
|
|
|
|
|
Jun 20 2017, 09:41
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487

|
Цитата(Димон Безпарольный @ Jun 20 2017, 16:37)  Не получается однако. Я так уже пробовал. Потому и спросил. Возможно влияет последовательность компиляции файлов
|
|
|
|
|
Jun 20 2017, 09:52
|
Знающий
   
Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247

|
Цитата(novikovfb @ Jun 20 2017, 12:40)  что-то Вы умалчиваете. В хедере должно быть объявление типа структуры и extern объявление переменной. Этот хедер должен подключаться во все файлы, где используется эта структура. В одном из файлов должна быть размещена эта струкутра, т.е. объявление переменной без extern, хедер этому мешать не будет. Возможно умалчиваю потому, что не понимаю механизма. В каком хедере должно быть объявление типа структуры? У меня в одном хедере размещена структура, в другом - я на нее сослался с помощью extern. Но получил ошибку (выше). Что я сделал неправильно?
|
|
|
|
|
Jun 20 2017, 10:01
|
Знающий
   
Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247

|
Цитата(novikovfb @ Jun 20 2017, 12:59)  Ничего волшебного. Хедеры используются исключительно для удобства и уменьшения вероятности ошибки при переписывании. Компилятор последовательно просматривает текст программы, подключает все хедеры в том порядке, в котором они упомянуты в #include. Видит объявление типа структуры - запоминает, что это такое. Когда видит extern ADC_my ADC_RAW - запоминает, что где-то есть такая структура уже известного типа ADC_RAW. Когда видит ADC_my ADC_RAW - проверяет, не противоречит ли это ранее увиденной extern ADC_my ADC_RAW и отводит место в памяти для этой структуры. Спасибо. Почему тогда ругается на extern ADC_my ADC_RAW; ? Цитата ../Src/stm32l1xx_it.c(91): error: #20: identifier "ADC_my" is undefined
Сообщение отредактировал Димон Безпарольный - Jun 20 2017, 10:06
|
|
|
|
|
Jun 20 2017, 10:08
|
Знающий
   
Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247

|
Цитата(Сергей Борщ @ Jun 20 2017, 13:06)  Потому что к моменту, когда он встретил упоминание этого типа он еще не видел заголовочного файла с объявлением этого типа. Хотите, чтобы он ожидал это объявление позже - пишите extern struct ADC_my ADC_RAW; Вот какие тонкости оказывается. Получилось. Спасибо. Но при обращении к такой структуре: Цитата ADC_NMEA(ADC_RAW.ADC_CH0) получаю ошибку: Цитата ../Src/stm32l1xx_it.c(152): error: #70: incomplete type is not allowed
Сообщение отредактировал Димон Безпарольный - Jun 20 2017, 10:12
|
|
|
|
|
Jun 20 2017, 10:34
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Код // a.h typedef struct A {int f; } AA; extern AA a;
//b.cpp #include "a.h" // тут будет включен полный текст файла а.h, в результате компилятор узнает, что есть тип АА и есть переменная а этого типа
// если бы мы не писали "extern AA a" в a.h, то это объявление пришлось бы писать везде, где нужна переменная "а". // Если она нужна всего в одном файле, то стоит ее там и определить, причем как "static AA a;" static означает, что переменная локальная для файла void f() { a.f = 2; }
// c.cpp #include "a.h" // компилятор работает с каждым файлом отдельно. Тут он уже забыл про АА и а, надо включить снова
AA a; // выше мы только объявили "а". Где-то должно быть и определение, иначе будет ошибка линковки. Определение может быть в любом файле проекта // но только в одном - если мы в a.h уберем extern, то объявление окажется в двух файлах (b.cpp и c.cpp), в результате будет ошибка линковки
void g() { a.f += 1; } А вообще наройте книжку по Си и почитайте, это ж основы. Сложно учить язык методом проб и ошибок
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|