реклама на сайте
подробности

 
 
> 4.41A не различает одинаковые символы из разных namespace, баг?
vet
сообщение Nov 15 2007, 13:14
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Тестовый пример:
Цитата(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 }


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 11)
VladislavS
сообщение Nov 15 2007, 20:19
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Мне кажется, что в main.cpp и в n1, и в n2 задана одна и та же extern int flags. Где вы сказали компилятору, что это разная переменная? Вы же явно сказали компилятору, чтобы он не заморачивался насчет переменной flags и доверил её поиск линкеру.
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 16 2007, 06:14
Сообщение #3


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(vet @ Nov 15 2007, 19:14) *
Тестовый пример:
Что видим в листинге (взят тулчейн для AVR, с ARM то же самое):

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

volatile b = n2::flags;


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 16 2007, 07:02
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



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

volatile b = n2::flags;

Не помогает, к сожалению.
Нагружал как угодно и в проверки вставлял.
Давал flags разные значения при инициализации.
Воспринимается тот, который раньше используется в программе, второй игнорируется.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Nov 16 2007, 07:32
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



А если написать это в одном модуле:
Код
namespace n1
{
    int flag;
}

namespace n2
{
    int flag;
}

int main()
{
}


При компиляции выдает: Internal Error: [CoreUtil/General]: OgModuleLabels -- label already defined
IAR AVR 4.30
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 16 2007, 07:54
Сообщение #6


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(IgorKossak @ Nov 16 2007, 13:02) *
Не помогает, к сожалению.
Нагружал как угодно и в проверки вставлял.
Давал flags разные значения при инициализации.
Воспринимается тот, который раньше используется в программе, второй игнорируется.

Тогда действительно похоже на баг.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 16 2007, 15:15
Сообщение #7


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Кто может отписать это на IAR?
На основании тестирования пробной 30-дневной версии можно?
Go to the top of the page
 
+Quote Post
ig_z
сообщение Nov 16 2007, 15:55
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



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


Легкий офтоп на тему посылки багрепортов в иар из личного опыта. Посылал как пользователь 30 дневной версии - реакции ноль. Через нашего человека (руководитель отдела разработки дебажных тулзов для мсп430) из германской площадки Тексаса послали багрепорт от лица официального пользователя. Прошло более полугода - в новой версии баг остался. На днях обнаружил новый баг, но посылать не буду, т.к. обнаруженные мной баги относятся к использованию шаблонов и похоже в иаре никого особо не интересуют.
Припоминаю время, когда на иаре была конфа. Так вот там было несколько гневных тредов по поводу реакции иара на кастомерский фидбек.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 16 2007, 16:20
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(dxp @ Nov 16 2007, 09:54) *
Тогда действительно похоже на баг.
Баг, баг. Я на него напарывался примерно полгода назад и мы его с тобой, кажется, обсуждали через ICQ. Еще один баг, но уже в C-SPY - он не различает статические члены в разных классах с одинаковыми именами. Он отбрассывает имя класса, и если статический член с таким именем в программе один, он его показывает в watch, если существуют два разных класса с одноименными статическими членами - говорит, что такого символа нет. Хотя компилирует правильно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 16 2007, 18:00
Сообщение #10


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



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

Интересуют, озвучьте пожалуйста.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Nov 19 2007, 07:36
Сообщение #11


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(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.
Go to the top of the page
 
+Quote Post
ig_z
сообщение Nov 20 2007, 10:37
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



Цитата(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 все работает как нужно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 15:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01483 секунд с 7
ELECTRONIX ©2004-2016