Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,794
Записей в блоге: 26
#1

Непонятная конструкция в C++ - C++

17.03.2014, 15:56. Просмотров 423. Ответов 3
Метки нет (Все метки)

Наткнулся на конструкцию, для которой g++ работает не так, как компилятор безо всяких расширений (в мойм случае это Sun CC).

C++
template <typename TReal> struct Random
{
  static TReal prec;
};
template struct Random <float>;
template <> float Random <float>::prec = 1.0f;
Код
$ g++ t.cc -c

$ readelf --symbols t.o
...
   Num:    Value  Size Type    Bind   Vis      Ndx Name
...
     9: 00000000     4 OBJECT  WEAK   DEFAULT    5 _ZN6RandomIfE4precE
...

$ readelf --sections t.o
...
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
...
  [ 5] .data._ZN6RandomI PROGBITS        00000000 00003c 000004 00 WAG  0   0  4
...
Key to Flags:
  ... G (group) ...
...
Видим, что g++ поместил static переменную prec шаблонного класса в секцию, у которой среди флагов присутствует (group), а сама переменная является weak. Т.е. это эквивалентно тому, что статическое поле класса стало множественно определяемым (по аналогии с inline-методами класса). У Sun CC этого эффекта нет и переменная строится как стандартный глобал (т.е. НЕ множественно определяемый). Данная конструкция помещена в заголовочный файл

Это явно какое-то GNU-расширение. В документации g++ в разделе расширений си++ в подразделе шаблонов ничего толком по этому поводу не написано http://gcc.gnu.org/onlinedocs/gcc-4....-Instantiation

Возможно, кто-то встречался с подобной конструкцией. Мне бы хотелось найти её описание. Но мне не хватает знаний в Си++, чтобы умным языком сформулировать то, что описано в этом исходнике и из чего можно было бы в google сделать поисковый запрос. В идеальном случае хотелось бы увидеть место, где описано сие расширение, а в минимальном - хотя бы правильно составить поисковый запрос
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2014, 15:56     Непонятная конструкция в C++
Посмотрите здесь:

C++ Конструкция if..
C++ Не работает конструкция с new
C++ конструкция
C++ Конструкция
непонятная конструкция, шаблоны C++
C++ Linux Конструкция if else
Что за конструкция? C++
C++ Интересная конструкция в C++
Конструкция в условии C++
Конструкция SWITCH C++
Что за конструкция? C++
C++ Не работает конструкция if else

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6548 / 3968 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.03.2014, 19:11     Непонятная конструкция в C++ #2
мой поисковый запрос в гугль: c++ template static variable
первая ссылка: http://stackoverflow.com/questions/1...tatic-variable
но про то что это расширение ничего не сказано
ValeryS
Модератор
6453 / 4919 / 451
Регистрация: 14.02.2011
Сообщений: 16,320
17.03.2014, 19:19     Непонятная конструкция в C++ #3
Evg,
я конкретно с ГНУ не работал
но так мысли вслух может это связано с template
статическая переменная одна на все экземпляры а экземпляры могут быть с разными переменными
хотя глупость получается
если один экземпляр int другой float статические переменные должны быть разные, разные типы структур, или не должны
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,794
Записей в блоге: 26
18.03.2014, 15:05  [ТС]     Непонятная конструкция в C++ #4
Цитата Сообщение от Jupiter Посмотреть сообщение
В моём примере идёт явная инстанциация всего класса и затем специализация статического поля класса. По ссылке ни в одном из примеров нету такой комбинации

Добавлено через 14 часов 40 минут
Вот чего подкинули знающие люди:

"corre issue 259":
http://www.open-std.org/jtc1/sc22/wg...fects.html#259

Переписка в gcc в 2002 году по поводу исправления "core issue 259":
http://gcc.gnu.org/ml/gcc-patches/2002-05/msg01496.html

И комментарий:

Если я правильно понял, по стандарту 1998-го года запрещалось одновременно инстанцировать и специализировать шаблон. Но это приводило к ограничению на библиотеки, в которых могла бы быть зашита специализация и одновременно позволялось бы пользователю инстанцировать шаблон, поэтому оформили дефект репорт (DR) и разрешили инстанцировать после специализации (впрочем, в стандарте 2003-го года просто разрешили компилятору не реагировать на нарушение этого правила - см. параграф 14.7.5, но в C++11 его изменили в соответствии с DR).
Добавлено через 3 часа 39 минут
DR касается случая, когда сначала делается специализация, а потом инстанциация. А у нас в обратном порядке. Т.е. по прежнему выглядит как gnu'тая самодеятельность. clang ведёт себя НЕ так, как gcc
Yandex
Объявления
18.03.2014, 15:05     Непонятная конструкция в C++
Ответ Создать тему
Опции темы

Текущее время: 22:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru