Язык C: проблема с использованием перечисляемой переменной и типа, определенного в файле main.c внутри другого файла - PullRequest
0 голосов
/ 28 декабря 2018

Я определил следующее перечисление и переменные в моем файле main.c:

enum state_codes {  S0,
        S1,
        S2,
        S3,
        S4,
        S10,
        S20,
        S30,
        S40,
        S50,
        S60,
        S70,
        S80,
        fail,
        fsmError
};

enum state_codes cur_state = S0;
enum state_codes old_state = S0;

В другой файл моего проекта (с именем othercode.c ) я должениспользуйте переменную cur_state и значения, перечисленные в перечислении внутри обработчика прерываний, поэтому я написал это объявление в верхней части файла othercode.c :

extern enum state_codes; // <-- first warning see below details
extern enum state_codes cur_state;

Внутри обработчика прерываний я написал этот код:

void EXTI4_IRQHandler(void)
{
     EXTI_ClearITPendingBit(EXTI_Line4);

    // FSM state saving inside the external EEPROM
    // cur_state : current state from the main.c file
    uint8_t data_byte;

    if (cur_state == S0) // <-- ERRORS see below details
    {
      data_byte = 0;
    }

    I2C_Memory_Write(I2C1, EE_ADDR_FSMSTATE, data_byte);

}

Относительно этой функции у меня есть предупреждение и ошибки, о которых сообщается ниже:

Warning[Pe1000]: a storage class may not be specified here C:\Users\ ... \othercode.c 49 

Error[Pe020]: identifier "S0" is undefined C:\Users\ ... \othercode.c 777 

Error[Pe070]: incomplete type is not allowed C:\Users\ ... \othercode.c 777 

Первое связывание связанообъявление:

extern enum state_codes;

и две другие ошибки функции в строке, о которой я сообщил в коде с помощью <- Errors. </p>

Что мне нужно сделать, так это обратиться кпеременная типа enum внутри другого файла, поэтому я объявил ее extern в этот файл, но кажется, что к этому типу класса хранения можно обратиться таким образом.Кто-то может указать мне правильное направление?

РЕДАКТИРОВАНИЕ

Я решил проблему, переместив перечисление в другой файл, как показано ниже:

enum state_codes {  S0,
        S1,
        S2,
        S3,
        S4,
        S10,
        S20,
        S30,
        S40,
        S50,
        S60,
        S70,
        S80,
        fail,
        fsmError
};
extern enum state_codes cur_state;

Код работаетправильно, но я любезно спрашиваю, если это правильный путь или есть какие-то другие вещи, которые следует учитывать.

Спасибо!

С наилучшими пожеланиями Fire

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Введите его в файл .h, затем #include этот файл во все файлы .c, где вы его используете.

IMO, это самый правильный путь.

0 голосов
/ 28 декабря 2018

Вы не можете сами определить тип enum extern, так как другой модуль компиляции должен знать значения своих случаев.То есть, поместите это в заголовок:

enum state_codes {  S0,
        // …
        fsmError
};

и включите заголовок из всех файлов, используя enum state_codes.Переменные все еще могут быть extern, например, ваши extern enum state_codes cur_state.

...