Поиск:

Ответ в темуСоздание новой темы Создание опроса
> static-член класса то работает, то нет 
:(
    Опции темы
borisbn
Дата 3.6.2013, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: нет
Всего: 135



Здравствуйте.

Имеется такой код:
Код
struct A {
    static const unsigned int CCC = 20;
    int foo( unsigned int x ) {
        return std::min( x, CCC );
    }
};

А теперь самое интересное:
в gcc 4.1.2 это не линкуется - http://codepad.org/LB1506hR
в gcc 4.3.2 линкуется - http://ideone.com/q1Uik8
в gcc 4.5.2 опять не линкуется - это уже на моей машине. ссылку дать не могу.
в gcc 4.7.2 снова линкуется - http://ideone.com/rP6zIF

Вопрос:
ошибка у меня и необходимо добавить
Код
const unsigned int A::CCC = 20;

или ошибка в компиляторах, в которых не линкуется ?
И вообще, что за чехарда с компиляторами (вернее с версиями) ? Или м.б. это какая-то настройка (на ideoone она включена, а у меня и на codepad нет) ? Если да, то какая ?

Спасибо.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 3.6.2013, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



Цитата(borisbn @  3.6.2013,  10:38 Найти цитируемый пост)
в gcc 4.5.2 опять не линкуется - это уже на моей машине. ссылку дать не могу.

Вы уверены в версии? (возможно еще разные версии выходили параллельно (?не знаю), то есть возможно еще год релиза нужно смотреть)

В шестой студии тоже нельзя было инициализировать стат.константы в классе.
В поздних версиях уже можно.

Почему?
Видимо в силу тумнности выражений стандарта С++, создатели компиляторов не вкурили его достаточно глубоко.  smile 
Посему старые версии такое не переваривают.

Новые же версии, (даже с ключами например -std=c++98), переваривают нормально.

Цитата(ISO/IEC 14882:2011)
9.4.2.3
If a non-volatile const static data member is of integral or enumeration type, its declaration in the class
definition can specify a brace-or-equal-initializer in which every initializer-clause that is an assignment-
expression is a constant expression (5.19).


PM MAIL   Вверх
borisbn
Дата 3.6.2013, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: нет
Всего: 135



> Вы уверены в версии? 
Да, вроде. Вызывал g++ -v и он выдал 4.5.2. По поводу года не скажу. Он был в поставке с Ubuntu 11.04.
Интересно то, что ошибка линковки возникает только если брать адрес (сылку) этой переменной (в моём случае это std::min). Если же использовать только как rvalue, то ошибки нет.
Я, всё-таки, склоняюсь к мнению, что тут дело в настройках компилятора...


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 4.6.2013, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



Цитата(borisbn @  3.6.2013,  21:25 Найти цитируемый пост)
ошибка линковки возникает только если брать адрес (сылку) этой переменной

А..., так это не из той оперы...

Это просто оптимизация.
Если убрать оптимизацию, то и новые gcc не будут компилить.
оптимизация: -O*


PM MAIL   Вверх
volatile
Дата 4.6.2013, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



Цитата(borisbn @  3.6.2013,  10:38 Найти цитируемый пост)
в gcc 4.5.2 опять не линкуется - это уже на моей машине. ссылку дать не могу.

Вы не привели комм строку.
В общем добавьте туда (в комм строку) одно из:
Код

-O
-O1
-O2
-O3

Скорей всего поможет... (Комилятор все-же не из прошлого века).



PM MAIL   Вверх
volatile
Дата 6.6.2013, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



borisbn, Да я понимаю ваше молчание...
Действительно, с какого это перепуга, правильность кода (компилируемость) зависит от введения/невведения оптимизации.
Код либо правильный, либо нет. Оптимизация на это не должна никак влиять.

Очень похоже на баг gcc. (Хотя логически понять причины такого поведения можно)
Вот максимально-сокращенный код который не компилируецца у меня на gcc 4.7.0 ни при каких оптимизациях.
Но кстати, прекрасно компилицца на студии.

Код

#include <iostream>
struct A { static const int CCC = 42; };

int main () { 
   std::cout << &A::CCC << std::endl;
}

Приглашаюцца к обуждению опытные gcc-шники, зубры-линуксоиды, а также вообще знатоки приплюснутых стандартов.
Велкам...

PM MAIL   Вверх
borisbn
Дата 6.6.2013, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: нет
Всего: 135



volatile, не.. я не по этому молчал. Вы попросили посмотреть параметры компиляции на моей машине, а её у меня на время забрали.
А по поводу оптимизации - вроде в online-компиляторах она выключена... И да.. не должна она влиять. Единственное - м.б. есть какая-то опция, влияющая на такое поведение ?

Цитата(volatile @  6.6.2013,  11:06 Найти цитируемый пост)
Приглашаюцца к обуждению опытные gcc-шники, зубры-линуксоиды, а также вообще знатоки приплюснутых стандартов.
Велкам...

Поддерживаю. Ждёмс.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 9.6.2013, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(volatile @  6.6.2013,  10:06 Найти цитируемый пост)
 &A::CCC


Цитата(volatile @  6.6.2013,  10:06 Найти цитируемый пост)
Очень похоже на баг gcc. (Хотя логически понять причины такого поведения можно)
Вот максимально-сокращенный код который не компилируецца у меня на gcc 4.7.0 ни при каких оптимизациях.
Но кстати, прекрасно компилицца на студии.


  smile, может все таки у студии баг (именнуемый в народе фичей) ?  smile


Цитата

9.4.2 Static data members
4. If a static data member is of const integral or const enumeration type, its declaration in the class definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that case, the member can appear in integral constant expressions. The member shall still be defined in a namespace scope if it is used in the program and the namespace scope definition shall not contain an initializer.


Это сообщение отредактировал(а) mes - 9.6.2013, 12:49


--------------------
PM MAIL WWW   Вверх
volatile
Дата 9.6.2013, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



Цитата(mes @  9.6.2013,  12:39 Найти цитируемый пост)
9.4.2 Static data members
4. If a static data member is of const integral or const enumeration type, its declaration in the class definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that case, the member can appear in integral constant expressions. The member shall still be defined in a namespace scope if it is used in the program and the namespace scope definition shall not contain an initializer.


mes,  ваша цитата мимо кассы.  здесь говорицца для случая когда нет инициализации в описании класса. 
(Кстати в этом случае и студия компилировать не будет)
И потом, давайте оставим студию, раз вас так она раздражает.

Сам факт что компилируемость кода зависит от оптимизации, уже достаточно стрёмен, не находите ? 



Это сообщение отредактировал(а) volatile - 9.6.2013, 23:26
PM MAIL   Вверх
mes
Дата 13.6.2013, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(volatile @  9.6.2013,  22:25 Найти цитируемый пост)
здесь говорицца для случая когда нет инициализации в описании класса. 

как по мне, так тут как раз таки грицца о случае, когда она есть при декларации внутри класса, и ее отсутвии вне класса..   smile 

Цитата(volatile @  9.6.2013,  22:25 Найти цитируемый пост)
что компилируемость кода зависит от оптимизации, уже достаточно стрёмен, не находите ? 

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


Цитата(volatile @  9.6.2013,  22:25 Найти цитируемый пост)
давайте оставим студию, раз вас так она раздражает.

ни капли не раздражает, просто у них свой взгляд на вещи и ориентироваться по ней на стандартность поведения "рискованно"  smile 

Это сообщение отредактировал(а) mes - 13.6.2013, 19:48


--------------------
PM MAIL WWW   Вверх
volatile
Дата 13.6.2013, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



Цитата(mes @  13.6.2013,  19:44 Найти цитируемый пост)
да, это баг.. 

ну слава богу  smile 

остальное весьма спорно.


Это сообщение отредактировал(а) volatile - 13.6.2013, 23:25
PM MAIL   Вверх
volatile
Дата 14.6.2013, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



smile 
Да и кстати, в окончательном варианте стандарта 2011, вашей цитаты, вообще нет (по крайне мере в данном пункте, и ближайших окрестностях).  smile 

Цитата(mes @  9.6.2013,  12:39 Найти цитируемый пост)
9.4.2 Static data members
4. If a static data member is of const integral or const enumeration type, its declaration in the class definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that case, the member can appear in integral constant expressions. The member shall still be defined in a namespace scope if it is used in the program and the namespace scope definition shall not contain an initializer.

Дальше идёт про другое...

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

Добавлено @ 00:27
user posted image

Это сообщение отредактировал(а) volatile - 14.6.2013, 00:38
PM MAIL   Вверх
mes
Дата 14.6.2013, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(volatile @  13.6.2013,  23:19 Найти цитируемый пост)
в окончательном варианте стандарта 2011, вашей фразы, вообще нет 

Цитата(volatile @  13.6.2013,  23:19 Найти цитируемый пост)
 не известно откуда взятой фразы,

ну так с более 10ка лет был актуален другой стандарт, в котором эта фраза была актуальна..  smile 


Цитата(volatile @  13.6.2013,  23:19 Найти цитируемый пост)
Добавлено через 7 минут и 38 секунд

ну и ?? обратили внимание на constexpr specifier ? и гдепродолжение цитаты, которое описывает приведенный Вами случай ? пару строчек ниже :
Цитата

The member shall still be defined in a namespace scope if it is used in the program and the namespace scope definition shall not contain an initializer.


Добавлено @ 01:02
Цитата(volatile @  13.6.2013,  22:23 Найти цитируемый пост)
ну слава богу
остальное весьма спорно

если внимательно прочитали цитату, то
Цитата

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

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

Это сообщение отредактировал(а) mes - 14.6.2013, 01:04


--------------------
PM MAIL WWW   Вверх
volatile
Дата 15.6.2013, 03:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: нет
Всего: 85



Цитата(mes @  14.6.2013,  00:52 Найти цитируемый пост)
обратили внимание на constexpr specifier ? и гдепродолжение цитаты, которое описывает приведенный Вами случай ? пару строчек ниже :
Цитата
The member shall still be defined in a namespace scope if it is used in the program and the namespace scope definition shall not contain an initializer.


mes, Ну хорошо, давайте предположим на миг что ваша трактовка верна, 
В вашей цитате ведь говорицца вообще о "статической константе" как таковой.
Там нет ни слова ни о взятии адреса, ни о чем либо подобном.
Что означает (если трактовать по вашему), абсолютно правильный компилятор вообще не должен принимать 
статическую константу, без отдельного определения ее где-то в *.cpp
Не только взятие адреса (о котором, повторяю нет ни слова), но и именно саму константу!
Именно так ваша трактовка и звучит. Не больше и не меньше.
Но gcc, вашей трактовке не соответствует, даже с ключом -pedantic. (тестовый код элементарен, не привожу)
Более того, вашей трактовке, не соответствует ни один известный мне компилятор.  smile 
Так что смысла продолжать дисскуссию не вижу.

PM MAIL   Вверх
mes
Дата 15.6.2013, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(volatile @  15.6.2013,  02:34 Найти цитируемый пост)
давайте предположим на миг

давайте хоть на миг )

Цитата(volatile @  15.6.2013,  02:34 Найти цитируемый пост)
В вашей цитате ведь говорицца вообще о "статической константе" как таковой.

не совсем, в середине цитате говорится еще об использовании константного выражения ассоциированного с константой  smile 
Цитата

In that case, the member can appear in integral constant expressions


Цитата(volatile @  15.6.2013,  02:34 Найти цитируемый пост)
Что означает (если трактовать по вашему), абсолютно правильный компилятор вообще не должен принимать 

нет, Вы не правильно трактуете мою трактовку.. так упустили то самое предложение из середины цитаты.. и не обратили почему же стоит "still" и "if" в последнем предложении, которые явно намекают, что должна быть еще одна ситуация..

Цитата(volatile @  15.6.2013,  02:34 Найти цитируемый пост)
Не только взятие адреса (о котором, повторяю нет ни слова), но и именно саму константу!

о взятии ни слова, но есть слова об использовании константы и использовании константного выражения... Акцент на взятии адреса был потому, что подобное использование никак нельзя отнести к константому выражению..

Цитата(volatile @  15.6.2013,  02:34 Найти цитируемый пост)
Именно так ваша трактовка и звучит. Не больше и не меньше.

именно так Вы хотите ее воспринимать.. 

Цитата(volatile @  15.6.2013,  02:34 Найти цитируемый пост)
Но gcc, вашей трактовке не соответствует, 

не моей ))

Цитата(volatile @  15.6.2013,  02:34 Найти цитируемый пост)
Так что смысла продолжать дисскуссию не вижу.

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


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | GNU toolchain | Следующая тема »


 




[ Время генерации скрипта: 0.1824 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.