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

    +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
    #include <stdio.h>
    #include <math.h>
    
    #define SET(var, ...) typeof(__VA_ARGS__) var = __VA_ARGS__
    
    SET(p, &puts);
    struct point_t { double x, y; };
    SET(point, (struct point_t){0.0, 1.0});
    SET(anonymous, (struct{char *s;}){"hui"});
    
    int main(void)
    {
        static SET(msg, "Halo!");
        p(msg);
        SET(sqrt_of_2, sqrt(2));
        printf("√2 = %f\n", sqrt_of_2);
        return 0;
    }

    Автовывод типов в "C".

    Запостил: MPA3b, 20 Марта 2019

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

    • ИМЕННО ПОЭТОМУ Я ЗА "МОКРОСЫ".
      Ответить
    • typeof –— это вроде гнутое расширение? А как с этим дела в других реализациях?
      Ответить
      • В стандарт "C11" вроде бы добавили, ещё "tcc" подерживает некоторые гнутые расширения, включая это.
        Ответить
        • Поэтому я за "SFINAE".
          Ответить
        • Изучая особенности «tcc», случайно узнал, что у «gcc» и «tcc» есть __attribute__((regparm(n)). К сожалению, поддерживается только на x86-32 и n не может быть больше трёх (при n=3 используются EAX, EDX, ECX).

          То ли дело «Watcom C» с произвольными коллконвеншнами.
          Ответить
        • Нет, typeof -- gcc'изм. Но есть _Generic

          https://stackoverflow.com/questions/40143815/is-it-possible-to-implement-gnu-cs-typeofx-with-c11s-generic
          Ответить
          • Да, действительно, я перепутал. А жаль, удобная штука.

            Именно поэтому я за "GNU C".
            Ответить
    • Мне ещё понравилось struct{char *s;}. Мне кажется, тут с рахит-тинктурой языка что-то не так.
      Ответить
    • Векторный петух, залогинься.
      Ответить
    • Ответить
    • В GCC для Си это уже есть готовое, называется __auto_type.
      Пролистай в самый низ страницы https://gcc.gnu.org/onlinedocs/gcc/Typeof.html
      > In GNU C, but not GNU C++, you may also declare the type of a variable as __auto_type. In that case, the declaration must declare only one variable, whose declarator must just be an identifier, the declaration must be initialized, and the type of the variable is determined by the initializer; the name of the variable is not in scope until after the initializer. (In C++, you should use C++11 auto for this purpose.)
      Ответить
      • Именно поэтому я загнуси.
        Ответить
        • Не для меня придёт весна,
          Не для меня Дон разольётся,
          И сердце девичье забьётся
          В восторге чувств не для меня.
          Ответить

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