Перейти к содержанию
    

Варнинг компоновщика

Был такой варнинг. Дело в том, что не должно быть объявления переменной как extern и одновременного объявления ее как локальной в одном файле. А у вас так и получается когда инклудится файл menu.h в menu.c - вначале переменнпая объявляется как extern , а потом как локальная.

В menu.h стоит охранник

#ifndef _MENU_H_

#define _MENU_H_

....

#endif

так, что повторное объявление отсутствует. Даже если бы это и было, то ругался бы компиллер - смотри выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В данном случае сказать особо нечего, но общее впечатление от собственного понимания причин предупреждений и ошибок ИАРа удручает.

Не далее как вчера. Слово shift не является зарезервированным на C, не так ли? Поле bla_bla_bla.shift дает ошибку, bla_bla_bla.shiftt работает.

Может и тут какая-то фигня с грамматикой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В данном случае сказать особо нечего, но общее впечатление от собственного понимания причин предупреждений и ошибок ИАРа удручает.

Не далее как вчера. Слово shift не является зарезервированным на C, не так ли? Поле bla_bla_bla.shift дает ошибку, bla_bla_bla.shiftt работает.

Может и тут какая-то фигня с грамматикой?

Насчет грамматики не знаю, но я не вижу криминала в приведенном Sergio66 коде. Подозреваю, что проблема где-то в непоказанном окружении кода. Поэтому и предложил сделать минимальный проект, и на его основе либо искать где-то в другом месте, либо пытаться понять чего мы не понимаем. У меня были подобные предупреждения когда я пытался объявить в одном файле массив с явным указанием размера а в другом без указания (через []) или как extern указатель на тип элементов массива.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну вот и решение!

Дело в том, что сама структура

typedef __flash struct

{

unsigned int *var_pointer;

unsigned char position;

unsigned char flags;

char left;

char right;

char up;

char down;

void (*relative_func)();

} item_struct_type;

описана в файле def_items.h

который подключен к stdafx.h

а stdafx.h, в свою очередь подключается к menu.c и menu.h

так вот, в файле menu.c def_items.h почему то не подключался. И компилятор не ругался на неизвестный тип item_struct_type.

Как только я подключил def_items.h непосредственно к menu.c, все заработало.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть такое определение:

typedef __flash struct

{

unsigned int *var_pointer;

unsigned char position;

unsigned char flags;

char left;

char right;

char up;

char down;

void (*relative_func)();

} item_struct_type;

оно находится в h файле

далее идут определения переменных в файле menu.c

 

item_struct_type Main_menu[NUMBER] = {инициализация};

и

item_struct_type *current_menu = Main_menu;

 

есть файл menu.h со следующими строками:

extern item_struct_type Main_menu[NUMBER] ;

и

extern item_struct_type *current_menu;

 

файл menu.h подключается к нескольким файлдам проекта

все прекрасно компиллируется, при компоновке выдаются 2 варнинга:

Warning[w6]: Type conflict for external/entry "Main_menu", in module Multidisplay against external/entry in module Menu; array types have different element types; different composite type kinds

и

Warning[w6]: Type conflict for external/entry "current_menu", in module LCD against external/entry in module Menu; different composite type kinds

соответственно

 

если я из этих файлов убираю все, включая #include menu.h, то такие же варнинги переходят на другие файлы, где подключается menu.h

В чем может быть дело.

 

Модификатор __flash из typedef убирал - ничего не меняется.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну вот и решение!

так вот, в файле menu.c def_items.h почему то не подключался. И компилятор не ругался на неизвестный тип item_struct_type.

Как только я подключил def_items.h непосредственно к menu.c, все заработало.

Фигня это какая-то, а не решение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...