Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Evg
Эксперт CАвтор FAQ
18374 / 6421 / 441
Регистрация: 30.03.2009
Сообщений: 17,812
Записей в блоге: 28
#1

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

17.03.2014, 15:56. Просмотров 466. Ответов 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 сделать поисковый запрос. В идеальном случае хотелось бы увидеть место, где описано сие расширение, а в минимальном - хотя бы правильно составить поисковый запрос
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2014, 15:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Непонятная конструкция в C++ (C++):

Непонятная разница в производительности - C++
Уважаемые эксперты! Есть у меня программа на С++, код которой я транслировал в двух системах: • Microsoft Visual Studio 2010 со...

Непонятная ошибка - C++ Builder
Не могу найти решение ошибки, понятно только, что она выскакивает при первом обращении к массиву, после этого всё норм. Если нажать на Ок...

непонятная ошибка - C++ Builder
Я пытаюсь создать хедер, в котором будут структуры, для использование в разных программах. При попытке создать хотя бы одну структуру,...

непонятная инструкция на C++ - C++ Builder
имеется конструкция на языке C++: if(h != ((HANDLE)-1)) {операторы} HANDLE определен в файле WinNT.h следующим образом: ...

в ShowMessage непонятная кодировка - C++ Builder
Доброго всем времени суток)) Проблема такая. Есть программа для внесения данным, и если некоторые данные не внесены то об этом сообщается...

Непонятная ошибка с переменными - C++ Builder
при обращении к любой переменной в этой функции вылетает ошибка void __fastcall TForm1::Button13Click(TObject *Sender) { if...

3
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.03.2014, 19:11 #2
мой поисковый запрос в гугль: c++ template static variable
первая ссылка: http://stackoverflow.com/questions/1553854/template-static-variable
но про то что это расширение ничего не сказано
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
17.03.2014, 19:19 #3
Evg,
я конкретно с ГНУ не работал
но так мысли вслух может это связано с template
статическая переменная одна на все экземпляры а экземпляры могут быть с разными переменными
хотя глупость получается
если один экземпляр int другой float статические переменные должны быть разные, разные типы структур, или не должны
0
Evg
Эксперт CАвтор FAQ
18374 / 6421 / 441
Регистрация: 30.03.2009
Сообщений: 17,812
Записей в блоге: 28
18.03.2014, 15:05  [ТС] #4
Цитата Сообщение от Jupiter Посмотреть сообщение
В моём примере идёт явная инстанциация всего класса и затем специализация статического поля класса. По ссылке ни в одном из примеров нету такой комбинации

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

"corre issue 259":
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.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
0
18.03.2014, 15:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2014, 15:05
Привет! Вот еще темы с ответами:

Непонятная кодировка в консоли. - C++ Builder
Всем привет! Вот код программы вложен в файл ниже. Так вот при вывод русских букв все хорошо и английские норм выводятся, а вот с...

Абсолютно непонятная ошибка - C++ Builder
Здравствуйте. Честно говоря, сомневаюсь, что мне кто-нибудь подскажет что-нить толковое, так как ошибка очень уж странная. Но тем не...

Непонятная потеря производительности с вещественными числами - C++ Builder
Я написал приложение в с++ builder 2010 для сравнения скорости расчета полинома при разных реализациях. Взял несколько вариантов: с++...

Непонятная конструкция - PHP
Объясните как понимать эту строку return ($a &lt; $b) ? -1 : 1; &lt;?php function cmp($a, $b) { if ($a == $b) { ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.