Ключевое слово "static" в с++

Тема в разделе "WASM.ZEN", создана пользователем iron_nomad, 12 май 2005.

  1. iron_nomad

    iron_nomad New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    30
    Добрый вечер васмовцы!



    В Джессе Либерти прочитал, что ситуация:



    static const bl_s = 5;



    int main()

    {

    .....

    }



    Была осуждена комитетом стандартизации.



    Но человек на днях мне присал исходник в котором, произошло

    подобное этому действие, а сделал он следущее:

    1. Определил класс

    2. В котором определил такую константу



    В последствии он использует эту константу при создании массива.



    Но тут то, при компиляции MS visual c++ v6.0, появляется ошибка:



    "d:\codded\visual_cpp\bla\bla.hpp(64) : error C2258: illegal pure

    syntax, must be '= 0'"



    жму на эту строку у меня выводит как раз таки на определение этой

    константы.



    Теперь же я думаю,как мне лучше решить просто убрать переменную

    bl_s за ключ.слово private или же можно по другому?



    При чем человек утверждает, что его компилятор код компилит!!!



    p.s.: если кому не влом, разъясните плиз, почему не рекомендуется

    так творить?
     
  2. Arvensis

    Arvensis New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2004
    Сообщения:
    72
    Адрес:
    Russia
    BUG: C2258 and C2252 on in Place Initialization of Static Const Members

    SYMPTOMS

    You may get the following error message if you try to perform in-place initialization of static const integral member data.
    Код (Text):
    1.  
    2. error C2258: illegal pure syntax, must be '= 0'
    3. error C2252: 'x' : pure specifier can only be specified for functions
    4.  


    RESOLUTION

    Use one of the following Resolutions:



    Use enum instead of static const int:
    Код (Text):
    1.  
    2. enum{x = 3};
    3.  


    Instantiate the member outside the class:
    Код (Text):
    1.  
    2. const int A::x=3;
    3.  


    STATUS

    Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    iron_nomad



    Скачай себе С++ компилятор и не парься с этим MS visual c++ v6. :derisive:
     
  4. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    СПасибо за мысли!
     
  5. aravar

    aravar New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2004
    Сообщения:
    35
    S_T_A_S

    Пожалуйста порекомендуйте приличный С++ компилятор
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Только DEV C++ не бери... там плохой оптимизатор.

    А Borland не пробовал?
     
  7. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    AsmGuru62

    А сам то че юзаешь?
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    aravar



    Порекомендовать ничего не могу :) Сам использую большей частью компилятор MSVC 7.1 (он бесплатный, если интересует размер кода, то конкурентов ему практически нет). Или Intel С++ 8.1. Аfaik стандарту больше соответствует GCC. С DEV C++, кстати, идёт старая версия MinGW - это его порт. Borland C++ и MSVC 6 - это не С++ компиляторы !





    EvilsInterrupt

    iron_nomad



    - вы братья?

    - нет, мы однофамильцы! :)
     
  9. iron_nomad

    iron_nomad New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    30
    S_T_A_S_

    ты кажется не часто читаешь форум иначе бы видел картинку, которую предоставил в одной из тем Coptain_cobalt так вроде пишется ник, ну если че сорри
     
  10. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    iron_nomad

    Картинку я видел. Я про то, что у тебя раздвоение личности =)
     
  11. rst

    rst New Member

    Публикаций:
    0
    Регистрация:
    5 май 2003
    Сообщения:
    165
    iron_nomad, вот такая конструкция :

    class x{

    static int i=10;

    }

    не может иметь место ни в одном из компиляторов.

    Причина - приравнивание в декларации класса применимо только к определению абстрактных функций (pure virtual). И естественно определение асбтрактной функции выглядит - void foo()=0; Это единственное возможное использование присваивания в декларации класса. И оно всегда должно быть функция = 0. Ни функция=2 ни 3 ни что-либо ещё. только функция=0;

    Идем дальше. Касательно статиков. Их инициализировать можно в другой единице компиляции. Т.е. к примеру :

    у тебя есть хидер foo.h и сорс foo.cpp

    при этом в хидере foo.h у тебя определние класса foo, а в сорсе - реализация.

    Соответсвенно вот тебе простой пример использования статиков в классе :

    foo.h:

    class foo{

    public: static int i;

    }

    foo.cpp:

    #include "foo.h"

    foo:i=10;



    Это фактически единственный вариант инициализации статических переменных.

    В конструкторах\других функциях инициализировать их нельзя. Т.к. инициализация будет происходить при создании каждого объекта. Скажем так - фактически можно, но глупо.



    Я сказал.
     
  12. iron_nomad

    iron_nomad New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    30
    rst



    Спасибо, я ждал такого ответа!
     
  13. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    Заодно, объясните зачем вообще нужна статическая константа?
     
  14. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    rst >




    Изначально (хотя, к сожалению, это никак не видно со слов автора трэда) речь шла о таком коде:
    Код (Text):
    1. class x{
    2. static [b]const[/b] int i=10;
    3. }
    Хотя, msvc почему-то позволяет и твой вариант.



    letopisec >




    Что бы не использовать препроцессор.
     
  15. iron_nomad

    iron_nomad New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    30
    S_T_A_S_

    Объвите, если не трудно случаи когда работы препроцессора можно избежать, и если есть силы стучать по клаве пальцами, то буду рад и коду!
     
  16. rst

    rst New Member

    Публикаций:
    0
    Регистрация:
    5 май 2003
    Сообщения:
    165
    S_T_A_S_



    Изначально (хотя, к сожалению, это никак не видно со слов автора трэда) речь шла о таком коде:



    class x{

    static const int i=10;

    }



    Эта запись так же является абсурдной. По той причине, что все константы - инициализируются в списке инициализаций.

    т.е.

    class foo{

    foo();

    }

    foo::foo():i=10

    {



    }



    Но никак не в декларации класса.

    Хотя, кстати исходя из того, что там используется static const - я не совсем представляю как _более_ правильно её инициализировать.

    Но опять же, резюме - присваивание в декларации класса возможно только для определения абстрактных функций.
     
  17. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    rst



    На сколько я понимаю, смысл static const в С++ - избавиться от определения констант посредством препроцессора (#define).



    Если делать присваивание в конструкторе - будет выделяться память под эту константу.

    Но константу можно скомпилировать в непосредственный операнд ассемблерной инструкции (и нормальный С++ компилятор должен это делать, если только нигде не используется ссылка на эту константу).



    Можно использовать enum (опять же, присваивание будет в декларации класса).

    Но как static const можно определять любой базовый тип и получить проверку типов на этапе компиляции.



    И вот что говорит ISO/IEC14882 (нового у меня нет):

     
  18. rst

    rst New Member

    Публикаций:
    0
    Регистрация:
    5 май 2003
    Сообщения:
    165
    S_T_A_S_

    насчет статиков - они всегда создаются на этапе компиляции в экзешнике.

    В случае классов - они не инстанциируются при создании класса, они всегда определены в суперклассе.

    Т.е. при присваивании - не будет выделяться память. Т.к. она уже выделена.

    В случае использования шаблонов - тоже самое. Т.к. шаблон генерируется на этапе компиляции.
     
  19. rst

    rst New Member

    Публикаций:
    0
    Регистрация:
    5 май 2003
    Сообщения:
    165
    А вот насчет того - можно ли или нельзя в декларации класса присваивание статикам делать - это имхо up to microsoft. Т.к. в микрософтовском компилере точно нельзя. В других возможно по-другому.
     
  20. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Happily, you don't have to care about any of this anymore. Fairly late in the standardization game, the C++ standards committee patched the C++ standard to let static integer constants be initialized in their declarations:
    Код (Text):
    1. class X
    2.     {
    3. public:
    4.     static int const n = 10; // initialization OK
    5.     void f2()
    6.         {
    7.         int a[X::n]; // OK
    8.         }
    9.     };
    10.  
    11. int const X::n = 10; // now an error -- multiple initialization
    12. int const X::n;      // definition OK, but might not be required
    Visual C++ .NET compiles this properly. Visual C++ 6.0 interprets the initialization of X::n as an illegal pure virtual function declaration.



    Источник: cl.exe Episode XIII: Attack of the Standards - Bobby Schmidt. Microsoft Corporation