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

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    /***
    *assert.h - define the assert macro
    *
    *       Copyright (c) Microsoft Corporation. All rights reserved.
    *
    *Purpose:
    *       Defines the assert(exp) macro.
    *       [ANSI/System V]
    *
    *       [Public]
    *
    ****/
    
    
    /*
    #include <crtdefs.h>
    
    #undef  assert
    
    #ifdef  NDEBUG
    
    #define assert(_Expression)     ((void)0)
    
    #else
    
    #ifdef  __cplusplus
    extern "C" {
    #endif
    
    _CRTIMP void __cdecl _wassert(_In_z_ const wchar_t * _Message, _In_z_ const wchar_t *_File, _In_ unsigned _Line);
    
    #ifdef  __cplusplus
    }
    #endif
    
    #define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
    
    #endif   */
    
    #pragma once
    #ifdef NDEBUG
    #define assert(expr)
    #else
    inline void CheckExpression_(bool expr)
    {
    	if (!expr)
    	{
    		expr=true; // put breakpoint here, happy user;
    		CheckExpression_(expr);
    	}
    }
    
    inline void CheckExpression_(void* expr)
    {
    	if (!expr)
    	{
    		expr=(void*)(1); // put breakpoint here, happy user;
    		CheckExpression_(expr);
    	}
    }
    
    #define assert(expr) CheckExpression_(expr);
    #endif

    Сука я не знаю, почему в студии-2008 родной ассерт показывает не ту строку, на которой он произошёл и в стеке вызовов хуйня какая-то, и как подключить DebugBreak я тоже не знаю, потому что в windef.h куча хуеты, выдающей 100500 ошибок компиляции. Чтобы хоть как-то можно было жить, пришлось сделать так.

    Запостил: TarasB, 13 Января 2016

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

    • сео-пост
      Ответить
    • #define NDEBUG не помогло?
      Ответить
      • нахуй мне ассерты тогда?
        Ответить
        • ну студия 2008 же тебе зачем-то нужна
          Ответить
          • а в новых все баги наконец-то исправили? ++11 хотя бы научились поддерживать?
            Ответить
    • > показывает не ту строку, на которой он произошёл и в стеке вызовов хуйня какая-то
      В соснольке/окошке не тот номер строки выводит? Или под дебаггером не туда брякается?

      Если дебаггером - есть вероятность, что у тебя pdb'шки почему-то рассогласовались с бинарником. Например, какие-то старые завалялись.
      Ответить
    • Может быть она на то и 2008, что 2016-ю уже можно ставить.
      Ответить
      • Ты чё, тут радоваться надо, что Тарас с 2003 на 2008 перелез. %%Может быть, скоро перестанет жрать кактус и всё-таки перелезет на gcc...%%
        Ответить
        • Кто этот тарас? Чем знаменит?
          Ответить
          • бог делфи и с++, древний и ужасный
            Ответить
            • Наверно очень древний. Может, пусть будет мир его праху? Неужто он по меметичности до Царя дотягивает?
              Ответить
              • Он с царем бился. И до сих пор жив, а царя нет.
                Ответить
          • Ты здесь недавно?
            Ответить
          • еще он геймдейвер - причем не какой нибудь фуфлыжный а самый, что ни наесть настоящий. Я даже в его гейму гамал.
            Ответить
        • дык комп-то новый, даже срусис на максималке тянет
          Ответить
        • На gcc 3.0 перелезет
          Ответить
    • А нельзя ли использовать MinGW вместо этой говностудии?
      Ответить
      • Нельзя. Он же её купил.
        Ответить
        • А не потеряю ли я ещё больше в комфорте и не нарвусь ли на ещё большее число багов?
          Ответить
          • У тебя будет возможность их пофиксить.
            Ответить
          • Я от попыток использовать студию вместо примитивного редактора и вызова mingw-шного gcc.exe через мейкфайлы, потерял в комфорте очень дохуя - эта ваша студия просто какое-то тормозное говно с кучей ненужных свистоперделок. Хотя может это мой опыт линупс-программирование сказывается
            Ответить
      • MinGW чертово лагалище, которое не умеет в PCH
        Ответить
        • > которое не умеет в PCH
          Т.е. они в версии под винду отломали прекомпайлед хедеры? Лол.
          Ответить
        • Гугл говорит, что PCH там есть
          Ответить
          • Который вызывает падение компилятора при общем размере PCH больше 130 МБ. А это - полторы библиотеки из буста.
            Ответить
            • Ну надо отдебажить значит. Там наверняка где-то оно на стеке аллоцирует, и тупо не хватает стека. В обычном GCC вроде никто не жаловался. В этих ваших студиях, если говорить о компиляторе плюсов, до сих пор нет SFINAE, constexpr, variable template, а в чистом C там вообще все глухо, до сих пор не поддерживается C99 - стандарт из прошлого века, блядь.
              Ответить
              • > до сих пор нет SFINAE

                в смысле? написать специализацию шаблона для класса, у которого есть такой-то метод, и в ++03 можно
                Ответить
                • Через костыли конечно можно.
                  http://blogs.msdn.com/b/vcblog/archive/2015/04/29/c-11-14-17-features-in-vs-2015-rc.aspx

                  Expression SFINAE No No
                  Нет значит нет

                  Хотя SFINAE это само по себе костыль
                  Ответить
                  • как показывает практика, если тебе нужен костыль, значит у тебя нет ноги
                    Ответить
                    • Т.е. тот факт, что в C++ есть костыль в виде SFINAE означает, что у C++ нет ноги?
                      Ответить
                      • в с++ действительно нет нормального шаблонного спецификатора "если у класса присутствует такое-то поле с такой-то сигнатурой то"
                        Ответить
                        • Я давно хочу волшебную конструкцию вида compiles("x.y()"), возвращает bool.
                          Ответить
                          • А лучше
                            constexpr HasMethod(x, "y", void(void));
                            Ответить
                            • > А лучше
                              Нет, не лучше. Мне хотелось в тестах проверять, что определённый код не компилируется, а не просто проверять наличие методов.
                              Ответить
                            • у шаблона помимо методов могут быть условно определены поля и типы.
                              Ответить
                              • constexpr HasField
                                constexpr HasType
                                constexpt GetEntity (typename T, size_t index)
                                Ответить
                    • Возможно, есть, но не там.
                      Ответить
            • Кстати, как там в студиях с поддержкой оптимизации, основываясь на правилах strict aliasing? Так же глухо?
              Ответить
              • Никак. Поэтому при портировании на гцц вылезает много весёлых багов)))
                Ответить
                • Чтоб не вылазили баги, можно тупо отрубать через -fno-strict-aliasing
                  Ответить
                  • Это понятно, но всё равно обидно, что думаешь, что всё ок, а на самом деле студия просто умолчала про косяки.
                    Ответить
                    • она не умалчивает, просто не использует strict aliasing по дефолту, и включить его нельзя, только ручная оптимизация, только хардкор
                      Ответить
                      • я про это и говорю, и даже предупреждение о том, что код косячный, отсутствует
                        Ответить
    • Алкоголь быстро дал результат, но не такой, какой я от него ожидал. Стало ещё хуже. В памяти начали проплывать сцены того времени, когда мы только начали встречаться; как она приезжала ко мне на выходные, и мы два дня тупо не вылезали из постели; её заботливое: "Доброе утро, соня!"... Выть хотелось от всего этого. Выть, как волки воют на луну. Теперь я понимаю, почему они так делают; видимо, им очень хреново в этот момент...
      Ответить

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