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

    +19

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    template<typename T>
    static json_string _itoa(T val) json_nothrow {  
            /*...*/
            long value = (long)val;
        
            /*...*/
    }

    Продолжаю бороться с поддержкой 64-битных чисел в libjson :/

    Запостил: myaut, 30 Декабря 2012

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

    • Рви шаблоны! Эм, буквально ;)
      Ответить
    • Кстати, а зачем тут шаблон? Одна банальная функция, принимающая long уже не катит?
      Ответить
      • Сиплюсплюс головного мозга в терминальной стадии
        Ответить
      • Шаблон тут потому что json_int_t - конфигурируемый при компиляции тип:

        #ifdef JSON_INT_TYPE
            typedef JSON_INT_TYPE json_int_t;
        #else
            typedef long json_int_t;
        #endif


        И он передается в _itoa
        Ответить
        • Все равно непонятно. Ну конфигурируется он. Но ведь потом, независимо от того, какой тип там наконфигурен в json_int_t, ваш шаблон дополнит\обрежет его до (32-битного?) long (строка 4)... Точно также работало бы и нешаблонное json_string _itoa(long value). Разве что выдало бы вполне резонный ворнинг, если попытаться засунуть туда 64 битное число.
          Ответить
          • Потому-то и говнокод, блин =) После исправления long на T, все начинает работать
            Ответить
            • А, ну если строку 4 выкинуть, и внутри функции вместо long юзать T, тогда шаблон очень даже логичен.
              Ответить
        • https://ideone.com/wKEmbV
          Ответить
          • https://ideone.com/bKaRrh
            Выкладываю код для тех, кто пока не поставил плагины для нахождения и открытия говнокодных ссылок:
            #include <iostream>
            #include <iomanip>
            using namespace std;
             
            struct Ugly
            {
                long long va;
                Ugly(long long va):va(va){}
                template<class T>
                explicit operator T() const
                {
                    return (T)va;
                }
            };
             
            void _itoa(long value) {
                std::cout << "itoa: " << dec << value << " " << hex << value << std::endl;
            }
             
            template<typename T>
            static void _itoa2(T val) {  
                long value = (long)val;
                std::cout << "itoa: " << dec << value << " " << hex << value << std::endl;
            }
             
            int main() {
             
                unsigned char x1 = 4;
                unsigned int x2 = 0x12345678;
                int x3 = 100500;
                long x4 = 100500;
                long long x5 = 0x123456789ABCDEF0ll;
                Ugly x6 = 265;
                
                
             
                    _itoa(x1); _itoa2(x1);
                _itoa(x2); _itoa2(x2);
                _itoa(x3); _itoa2(x3);
                _itoa(x4); _itoa2(x4);
                _itoa(x5); _itoa2(x5);
                /*_itoa(x6);*/ _itoa2(x6);
                    return 0;
             
            }
            Ответить
            • Работаешь ботом-выкладчиком?

              P.S. Я не думаю, что у него там есть свой класс для чисел, а тем более с эксплисит оператором.
              Ответить
    • P.S. Начинать название идентификатора с подчеркивания - моветон.
      Ответить
      • @property (nonatomic, retain) NSString* test;

        /Users/krypt/projects/KryptsUtils/KryptsUtilsTests/HelpersTests.m:35:1:
        Autosynthesized property 'test' will use synthesized instance variable '_test', not existing instance variable 'test'


        При Джобсе такого небыло!
        Ответить
        • *не было
          Ответить
        • При Джобсе было тоже самое, только _ писали вручную и синтесайзили тож вручную.
          Ответить
          • При Джобсе это писалось программистом, и если он использовал там андерлайны, то ссзб.
            Ответить
      • Необходимо сделать универсальный компилятор/интерпретатор, в котором всякая такая байда будет ворнингами и еррорами. Например:
        Ворнинг! Вы используете идентификатор, начинающийся с подчёркивания.
        Еррор! Слишком частое использование функций работы с датами на килобайт кода. (для пыхеров)
        Еррор! Обнаружен код '== true' или '== false', критически высокая вероятность бульшита.
        Ну и опять же для пыхеров, обнаружен тернарник с возвращаемыми строками 'yes' 'no', бульшит детектед.

        Ну и так далее по канону
        Ответить
        • Эм, так всякие lint'ы и им подобные для этого и предназначены. И в них всяко есть такие проверки.

          Ну и в соседнем треде обсуждали как раз FxCop для шарпика, он ругался на методы, в именах которых есть Uri, но они не возвращают Uri.
          Ответить
          • lint - не то. то надо прямо в пыхпых пихать )
            Ответить
            • > надо прямо в пыхпых пихать
              Не прокатит, пыхеры опытные люди, они все эти ворнинги собачками затравят.
              Ответить
        • Ну собственно из выхлопа splint'а:
          1.c:1:5: Name _test is in the implementation name space (any identifier beginning with underscore) External name is reserved for system use by ISO C99 standard. (Use either -isoreserved or -namechecks to inhibit warning)
          Ответить
          • А вот кстати. "test" (без андерлайна) написал я сам. А написать "_test" меня подталкивает IDE.
            Ответить

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