1. C++ / Говнокод #19753

    +4

    1. 1
    2. 2
    3. 3
    typedef class foo_c{
    ...
    } foo_t;

    Почему мне хочется использовать такой синтаксис?

    Запостил: mittorn, 04 Апреля 2016

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

    • (deftype Foo [^:volatile-mutable lbar]
        IEditBar
        (get-bar [this] (. this lbar))
        (set-bar! [this val] (set! lbar val)))

      Почему мне хочется использовать такой синтаксис?
      Ответить
    • потому что весна
      Ответить
    • > Почему мне хочется использовать такой синтаксис?
      У нас в школе был чувак с фамилией долбач. В НАШЕЙ школе он протянул меньше месяца.
      Ответить
    • называется фантомные боли

      очень давно в сишке требовалось либо struct foo bar; при объявлении переменных типа структуры, либо то, как у тебя наверху добавить алиас через typedef, тогда можно алиас без struct

      но это было пару десятков лет назад
      Ответить
      • > было пару десятков лет назад
        Как там, в 2031?
        Или в С11 что-то поменяли с алиасами, а я пропустил.
        Ответить
        • заинтриговал, сейчас полезу смотреть
          (по факту, все сишные компиляторы, которые я оставил в прошлой жизни, вот эту ебалайку со struct не просили уже давно)
          Ответить
        • посмотрел, в с11 всё так же

          на правах оффтопа - нахуя?
          почему в С++ нет проблемы понять, что означает имя типа, а в С продолжают жрать кактус?
          Ответить
          • совместимость же. Да и в чем кактус, лень typedef написать?
            Правда в большинстве api в аргументах функций хладнокровно пишут struсt foo_c * foo без всяких typedefов, но у этих наркоманов свое оправдание есть - это чтоб пользователи сразу видели, структура там или простой тип.
            Ответить
            • совместимость с чем?
              если например вышел новый стандарт, то априори у тебя код не соберется старым компилятором

              > структура там или простой тип
              компилятору вообще насрать - он знает, сколько это занимает места, и кладёт копию на стек
              поведение структуры от int ничем не отличается
              Ответить
              • Для компилятора - не отличается. А тому кто пишет на си - очень важно, можно ли смело копировать этот foo_xz или там тыща байт внутри.
                Если struct - повод насторожиться, если не struct - скорее всего это очередной enum или просто int по старой традиции переопределили.
                Ответить
                • какая разница, смело или нет - если оно ожидается в параметрах функции в api как значение, компилятору (и => тому кто пишет на си) придется его туда скопировать, отменить ты это не сможешь

                  анахронизм какой-то, неужели не очевидно
                  Ответить
                  • Как это не смогу? Не буду вызывать эту функцию.
                    А вот если она передается как указатель - я сразу буду знать, можно ли под нее локальную переменную выделить или не стоит и лучше только статическими делать или как-то еще экономить.
                    Ответить
                • ой, да ладно
                  никто не пишет struct давно

                  все его затайпдефали
                  Ответить
              • > если например вышел новый стандарт, то априори у тебя код не соберется старым компилятором

                Старому коду как-то посрать на выход новых стандартов, речь идет об обратной совместимости.

                > поведение структуры от int ничем не отличается

                если говорить о плюсах, то для нетривиальных структур отличается.
                Ответить
                • > Старому коду как-то посрать на выход новых стандартов, речь идет об обратной совместимости.
                  теперь я понял что ты имел в виду

                  сишка позволяла, а долбоёбы с удовольствием пользовались тем, что теги структур и другие имена имеют непересекающиеся пространства имён
                  struct S S;
                  + есть фанатики этой "фичи"

                  ну тогда да, им уже ничего не поможет
                  Ответить
                  • > struct S S;
                    Это сильно/как-нибудь мешает?

                    С помощью typedef можно задать типу произвольный псевдоним, т.е. он не будет выделенным словом, т.е. в грамматике будет той же сущностью, что и обычный идентификатор, т.е. парсер и так с этим трахается, ему хуже не будет.
                    int f(int s); // выделенное слово int
                    int f(my_int s); // typedef => трахаемся с идентификаторами
                    int f(s s); // ничем от предыдущего не отличается
                    Ответить
                    • > С помощью typedef
                      ты добавляешь тег структуры в пространство имен, где переменные и другие имена типов, и многие фанатики считают, что так делать харам

                      т.е.
                      // 1
                      struct S S; // now we have variable S of type "struct S"
                      
                      // 2
                      typedef struct S S;  // very very bad,  حرام
                      S s; 
                      
                      // 3
                      typedef struct S S;
                      S S;  // no u cant

                      введение разрешение на пропуск struct сделает "старый код" из п.1 нерабочим
                      Ответить
                      • А, всё из-за одного неймс пейса. Как-то нелогично это. Вот в питоне имя типа - какая-то rvalue, и есть смысл путать её с переменной, а тут они могли бы и не пересекаться.
                        Ответить

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