1. Си / Говнокод #11582

    +132

    1. 1
    2. 2
    3. 3
    4. 4
    enum
      {
        MaxStringLen = 1024
      };

    Офигенный метод объявления констант!

    Запостил: glook, 13 Августа 2012

    Комментарии (39) RSS

    • Ну а что остается в Си? enum да #define.
      Ответить
      • По мне так лучше дефайн. Куча таких безымянных енумов очень сильно портит читаемость кода.
        Ответить
        • Хуже кучи безымянных енумов, наверное, только один безымяный енум, в который набили несвязных констант...
          Ответить
        • дефайны не зависят от контекста - например ты их ни в нэймспэйс ни в класс не засунешь.

          сорить глобальный контекст, тем более такими замечательными константами с такими выразитильными именами, это говно.
          Ответить
          • Это спартаСи. Тут нет классов и нейсмспейсов.
            Ответить
            • ... от тюрьмы да от сумы С++ не зарекайся.

              почти во всех С проектах в которых я учавствовал было правило что хидеры/етц должны быть юзабельными из С++. в одном проекте, один из центральных С хидеров с ключевыми определениями, в С++ пихался в свой нэймспейс. (extern "C" предотвращает нэйм манглинг, но с точки зрения С++ компилятора функции все равно находятся в нэйспэйсе.)
              Ответить
              • Если называть макроконстанты не нарушая соглашений:
                #define MAX_STRING_LEN 1024 // вот так
                #define MaxStringLen 1024 // но ни в коем случае не так
                То ни с чем никогда они конфликтовать не будут, и проблем при С++ компиляции они не доставят.
                Ответить
                • Жависты тоже одобряют.
                  Ответить
                • > То ни с чем никогда они конфликтовать не будут [...]

                  За исключением другого хидера (другой) библиотеки которая тоже определяет MAX_STRING_LEN?
                  Ответить
                  • #define SMURF_MAX_STRING_LEN 1024
                    Ответить
                    • о. класная идея. я теперь вместо foobar буду везде smurf писать. :)
                      Ответить
                  • Какая разница, там же тоже будет 1024, длиннее ведь строк не может быть, и никому не придёт в голову привязывать к этому символу другое значение.
                    Ответить
                  • > За исключением другого хидера (другой) библиотеки которая тоже определяет MAX_STRING_LEN?
                    Они тогда и в Си будут конфликтовать, а т.к. там нет неймспейсов - то там и enum'ы тоже будут конфликтовать. Поэтому кроме приписывания префикса вариантов особо и нет.
                    Ответить
                    • да, они будут в С конфликтовать.

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

                        Ну и в любом случае остается еще конфликт на уровне компоновщика, который разбрасыванием по нейсмспейсам уже не устранить (т.к. мы обязаны включить extern "C").

                        Так что только префиксы, только хардкор ;)
                        Ответить
    • А в С нет const?
      Помнится, в Visual C++ 6.0 внутри класса нужно было писать именно енум, static const int MaxStringLen = 1024; не поддерживал компилятор.
      Ответить
      • В классическом K&R Си const нет. Но некоторые компиляторы добавляют.
        > static const int MaxStringLen = 1024
        Внутри класса некоторые компиляторы допускают инициализацию констант интегрального типа.
        Но даже если и не допускает, то делают так:
        const int Class::MaxStringLen = 1024; // вне класса
        Ответить
        • классический не нужен - нужен соответствующий стандарту
          в стандарте С (даже в с89), конечно, есть const

          статические константы интегрального типа с инициализацией внутри класса обязаны работать даже в с++98/с++03, просто vс 6.0 не совсем компилятор, поддерживающий стандарт
          Ответить
          • >классический не нужен - нужен соответствующий стандарту
            >просто vс 6.0 не совсем компилятор, поддерживающий стандарт
            Делаем вывод
            Ответить
      • const то в Си есть. Но вот ЕМНИП в с89 константы, описанные таким образом, не получится использовать как метки в switch и при инициализации других констант.
        Ответить
    • Вот так всегда: запощу какую-нибудь шнягу - начинаются войны "кто лучше знает стандарты" =)
      Ответить
      • похапешников хлебом не корми, только бы фреймворки и движки писать
        крестьян хлебом не корми, лишь бы стандарт был бы соблюдён
        шарпеев хлебом не корми, лишь бы LINQ был
        жаболюбов хлебом не корми, лишь бы код был на паттернах
        Ответить
        • Всё правильно сказал.
          КодоОбезьян хлебом не корми, лишь бы были бананы.
          1Cников хлебом не корми, лишь бы на русском.


          А Тараса чем ты не корми - он уже так растолстел, что на говнокод не влезает.
          Ответить
          • > А Тараса чем ты не корми - он уже так растолстел, что на говнокод не влезает.
            ждем 26 августа
            Ответить
        • ассемблерщиков хлебом не корми, лишь бы за один такт
          хаскелистов хлебом не корми, лишь бы с лямбдами и монадами
          лисперов хлебом не корми, лишь бы скобок побольше
          питонистов хлебом не корми, лишь бы python-way
          Ответить
          • Жабоскриптеров хлебом не корми, лишь бы жкуери.
            Паскалистов хлебом не корми, лишь бы не С++.

            Бля. Началось.
            Ответить
            • Что? Где? Я что-то пропустил?
              Ответить
              • Зато индусов и китайцев главное хлебом кормить.
                Только вот их хер прокормишь...
                Ответить
              • Не отвлекайся!
                Ответить
                • Ой, хватит эти голубые наклонности... Мне иногда кажется, что rat4 подменили на rat4 или на очень rat4.
                  Ответить
          • >ассемблерщиков хлебом не корми, лишь бы за один такт
            ассемблерщиков хлебом не корми, лишь бы на такт быстрее
            Ответить
          • скульщиков хлебом не корми, лишь бы без подзапросов
            Ответить
        • > похапешников хлебом не корми, только бы фреймворки и движки писать
          Похапешников хлебом не корми.
          fxd
          Ответить
      • потому что о наболевшем
        Ответить
    • у нас на ВМК, между прочим, по стилю кодирования положено объявлять константы именно через enum, а не define и глобальный const. http://algcourse.cs.msu.su/?page_id=39
      Ответить

    Добавить комментарий