Отсутствует объявление для определения объекта (Правило MisraC2012-8.4) - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь понять, что делать с этой ошибкой: требуется: отсутствует объявление для определения объекта [hi] (правило MisraC2012-8.4) Мой код:

typedef struct {
    int l;
} some_struct;

some_struct hi = {
    5
};

int main(void) {
    return(0);
}

stati c решить эту проблему, но мне нужно использовать эту переменную как extern из другого файла.

1 Ответ

3 голосов
/ 05 февраля 2020

Правило 8.4 касается несовместимости типов объектов с внешней связью. Существует возможная серьезная ошибка, которую правило призвано предотвратить: объявить объект одним типом в одном файле, а затем определить его как другой тип в другом файле.

Для предотвращения таких ошибок MISRA требует, чтобы предыдущий extern объявление объекта является видимым для файла, который содержит определение.

Так что, если вы хотите, чтобы some_struct hi было определено в области видимости файла, вы должны добавить объявление где-то тоже, предпочтительно в заголовочном файле :

extern some_struct hi;

static решает проблему, потому что тогда у вас больше нет внешней связи, и тогда правило не применяется.

Обратите внимание, что (неконстантно) extern spaghetti Глобалы крайне не рекомендуется в любой форме программы, MISRA или без MISRA. В подавляющем большинстве возможных случаев наличие таких глобальных переменных в программе вызвано неправильным дизайном программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...