Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 4.41A не различает одинаковые символы из разных namespace
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
vet
Тестовый пример:
Цитата(n1.cpp)
Код
namespace n1 {
  int flags;
}

Цитата(n2.cpp)
Код
namespace n2 {
  int flags;
}

Цитата(main.cpp)
Код
namespace n1 {
extern int flags;
}
namespace n2 {
extern int flags;
}

volatile int a;

int main()
{
  a = n1::flags;
  a = n2::flags;
  return 0;
}

Что видим в листинге (взят тулчейн для AVR, с ARM то же самое):
Цитата(main.s90)
Код
`?<Name n1 0>`      SYMBOL "n1"
flags               SYMBOL "flags", `?<Name n1 0>`

        EXTERN flags
...
        RSEG CODE:CODE:NOROOT(1)
//   13 int main()
main:
//   14 {
//   15   a = n1::flags;
        LDI     R30, LOW(flags)
        LDI     R31, (flags) >> 8
        LD      R16, Z
        LDD     R17, Z+1
        LDI     R30, LOW(a)
        LDI     R31, (a) >> 8
        ST      Z, R16
        STD     Z+1, R17
//   16   a = n2::flags;
        LDI     R30, LOW(flags)
        LDI     R31, (flags) >> 8
        LD      R16, Z
        LDD     R17, Z+1
        LDI     R30, LOW(a)
        LDI     R31, (a) >> 8
        ST      Z, R16
        STD     Z+1, R17
//   17   return 0;
        LDI     R16, 0
        LDI     R17, 0
        RET
//   18 }
VladislavS
Мне кажется, что в main.cpp и в n1, и в n2 задана одна и та же extern int flags. Где вы сказали компилятору, что это разная переменная? Вы же явно сказали компилятору, чтобы он не заморачивался насчет переменной flags и доверил её поиск линкеру.
dxp
Цитата(vet @ Nov 15 2007, 19:14) *
Тестовый пример:
Что видим в листинге (взят тулчейн для AVR, с ARM то же самое):

Не уверен, что это баг. У вас тут объект в одном из пространств имен ничего не делает полезного, компилятор просто его оптимизировал - имеет полное право. Нагрузите его полезной работой. Хотя бы заведите вторую переменную:

volatile b = n2::flags;
IgorKossak
Цитата(dxp @ Nov 16 2007, 08:14) *
Не уверен, что это баг. У вас тут объект в одном из пространств имен ничего не делает полезного, компилятор просто его оптимизировал - имеет полное право. Нагрузите его полезной работой. Хотя бы заведите вторую переменную:

volatile b = n2::flags;

Не помогает, к сожалению.
Нагружал как угодно и в проверки вставлял.
Давал flags разные значения при инициализации.
Воспринимается тот, который раньше используется в программе, второй игнорируется.
Непомнящий Евгений
А если написать это в одном модуле:
Код
namespace n1
{
    int flag;
}

namespace n2
{
    int flag;
}

int main()
{
}


При компиляции выдает: Internal Error: [CoreUtil/General]: OgModuleLabels -- label already defined
IAR AVR 4.30
dxp
Цитата(IgorKossak @ Nov 16 2007, 13:02) *
Не помогает, к сожалению.
Нагружал как угодно и в проверки вставлял.
Давал flags разные значения при инициализации.
Воспринимается тот, который раньше используется в программе, второй игнорируется.

Тогда действительно похоже на баг.
IgorKossak
Кто может отписать это на IAR?
На основании тестирования пробной 30-дневной версии можно?
ig_z
Цитата(IgorKossak @ Nov 16 2007, 19:15) *
Кто может отписать это на IAR?
На основании тестирования пробной 30-дневной версии можно?


Легкий офтоп на тему посылки багрепортов в иар из личного опыта. Посылал как пользователь 30 дневной версии - реакции ноль. Через нашего человека (руководитель отдела разработки дебажных тулзов для мсп430) из германской площадки Тексаса послали багрепорт от лица официального пользователя. Прошло более полугода - в новой версии баг остался. На днях обнаружил новый баг, но посылать не буду, т.к. обнаруженные мной баги относятся к использованию шаблонов и похоже в иаре никого особо не интересуют.
Припоминаю время, когда на иаре была конфа. Так вот там было несколько гневных тредов по поводу реакции иара на кастомерский фидбек.
Сергей Борщ
Цитата(dxp @ Nov 16 2007, 09:54) *
Тогда действительно похоже на баг.
Баг, баг. Я на него напарывался примерно полгода назад и мы его с тобой, кажется, обсуждали через ICQ. Еще один баг, но уже в C-SPY - он не различает статические члены в разных классах с одинаковыми именами. Он отбрассывает имя класса, и если статический член с таким именем в программе один, он его показывает в watch, если существуют два разных класса с одноименными статическими членами - говорит, что такого символа нет. Хотя компилирует правильно.
IgorKossak
Цитата(ig_z @ Nov 16 2007, 17:55) *
На днях обнаружил новый баг, но посылать не буду, т.к. обнаруженные мной баги относятся к использованию шаблонов и похоже в иаре никого особо не интересуют.

Интересуют, озвучьте пожалуйста.
alexander55
Цитата(ig_z @ Nov 16 2007, 18:55) *
т.к. обнаруженные мной баги относятся к использованию шаблонов и похоже в иаре никого особо не интересуют.

Вы зря так, очень даже интересует.
P.J.Plauger выпустил книгу с названием типа "STL- стандартная библиотека шаблонов С++", даже на русском языке появляется (600 с лишним страниц).
PS. В Help по IAR Вы видите
Copyright © 1989-2002 by P.J. Plauger and Jim Brodie. All rights reserved.
ig_z
Цитата(IgorKossak @ Nov 16 2007, 22:00) *
Интересуют, озвучьте пожалуйста.

Тестовый пример не делал, попробую объяснить на словах.
Если попытаться генерить по шаблону статические члены класса (что то типа такого)
Код
template <int r> class ri_bu
{
public:
  static char get_count(){return count;};

private:
  static char count;
};

class c1 : public ri_bu<1> {};
class c2 : public ri_bu<2> {};
---------------------------------------
char c1::ri_bu<1>::count = 1;
char c2::ri_bu<2>::count = 2;

то линкер выдает undef ext ...
Если все поместить в один файл, то все ок.
Если сделать те же классы без помощи шаблонов, все ок
В MSVS все работает как нужно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.