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

    −47

    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
    #include <stdio.h>
    #include <inttypes.h>
    
    typedef struct {uint32_t dummy;} str32;
    
    int main (void)
    {
        // тут получаются нули
        printf("%zu\n", sizeof( struct {uint32_t;} ) );
        printf("%zu\n", sizeof( (struct {uint32_t;}){} ) );
        
    
        // а тут получаются 4 как и планировалось
        printf("%zu\n", sizeof( str32 ) );
        printf("%zu\n", sizeof(uint32_t) );
        return 0;
    }

    Попытки получить размер анонимной структуры. Компиляторы clang gcc icc под линупсом почему-то возвращают 0. Не может же это быть багом сразу в трех компиляторах?

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

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

    • Хотя если сделать
      printf("%zu\n", sizeof( struct {uint32_t dummy;} ) );
      printf("%zu\n", sizeof( (struct {uint32_t dummy;}){} ) );

      то все нормально получается. Удивительно!
      Ответить
    • warning: declaration does not declare anything
      warning: struct has no members


      Вот интересно, почему это всего лишь ворнинг...
      Ответить
      • > warning: struct has no members

        http://melpon.org/wandbox/permlink/Bs8OSY7oTtg1spMO нет такого ворнинга у меня
        Ответить
        • -pedantic

          Но вообще и declaration does not declare anything как бы намекает, что произошла какая-то хуйня... Интересно, зачем вообще разрешили пустые декларации без переменных. В крестах это таки ошибка.
          Ответить
          • когда пишешь парсеры часто стоит выбор между анонимной и именованной неиспользуемой переменной. А именовать их reserved_1..reserved_10 не комильфо. Особенно заметно при использовании битовых полей
            Ответить
          • А этот педантик вообще возможно выполнить?
            А то знаешь, "не все члены структуры инициализируются в конструкторе". Или "вы исползуете стандартную функцию такую-то, используйте вместо неё нашу ни с чем не совместивую функцию" (это из эмэсвэцэ).
            Ответить
            • Вполне возможно. Это всего лишь соответствие стандарту без расширений.
              Ответить
          • Кстати, а яблошланг компилирует
            [boris@mbp ~]$ echo "class z { int; }; int main() { z a; }" | g++ -x c++ - -std=c++14
            <stdin>:1:11: warning: declaration does not declare anything [-Wmissing-declarations]
            class z { int; }; int main() { z a; }
                      ^~~
            1 warning generated.
            Ответить
      • > Вот интересно, почему это всего лишь ворнинг...

        Меня больше интересует, почему функция, не возвращающая значение, является только ворнингом, да ещё и не включенным по дефолту.
        Ответить
        • Ну, в некоторых случаях, компилятор не может понять, что определённой ситуации не может быть никогда.
          Ответить
          • Вот только этих некоторых случаев гораздо меньше, чем нормальных, где этот ворнинг спасает от UB'а...

            Ну и сегодня этой ситуации не может быть никогда, а завтра вася добавил новое значение в енум или условие цикла поправил... Никогда не говори никогда :)
            Ответить
            • Ну я говорил о ситуации, когда определённая комбинация входных параметров явно запрещена, ничего полезного с ней сделать нельзя, функция не предусматривает возврата кода ошибки, исключениями тут не пользуются, и вообще держите а=0/0 или assert(false).

              Кстати, когда-то ГЦЦ подобным образом реагировал даже на пути с abort или exit. Приходилось писать return huinya; после безусловного аборта.
              Ответить
          • P.S. Самый прикол - когда один и тот же компилятор строит из себя цундере и выдаёт "unreachable code" если напишешь return и "not all path returns a value" если не напишешь. Тарас, емнип, тут про такое писал.
            Ответить

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