Блог пользователя Burunduk1

Автор Burunduk1, 11 лет назад, По-русски

Доброго времени суток.

Сейчас на сборах школьников к межнару нам регулярно приходится делать задачи... естественным образом мы некоторое время потратили на изучение testlib.h, плодами которого я и хочу поделиться =)

Такое ощущение, что текущий testlib.0.9.7 (revision 106)

  1. Не компилируется под Windows g++ 4.8.1 с -std=c++03 и -std=c++11 (но компилируется с -std=gnu++03 и -std=gnu++11, т.е. с гнусными расширениями стандарта)

  2. Никак не компилируется под MacOS g++ (или таки есть правильный набор ключей?)

И то, и другое лечится выпиливанием некоторых "не нужных" кусков testlib.h. Подскажите, пожалуйста, это уже где-нибудь обсуждалось? Что планируется с этим делать?

Есть еще 3: check.exe input correct-output file-not-found выдает вердикт wrong answer. Это бага или фича? =)

P.S. Совет "делайте в полигоне" не принимается, как минимум, у нас часто другой формат задач.

  • Проголосовать: нравится
  • +22
  • Проголосовать: не нравится

»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

У меня Xcode сходу нормально подцепил testlib. В настройках проекта установлены С++ Language Dialect: -std=gnu++11 С++ Standart Library: libc++

  • »
    »
    11 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Спасибо. Вернется владелец Мака, опробую) А с -std=c++11 не компилит, правильно?

    UPD: g++ оказался 4.2, под ним -std=gnu++98,gnu++03,gnu++11 unrecognized.

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      У меня clang с --std={c++11, c++03} компилит. А какие у тебя ошибки ты с -Werror компилишь? У меня просто вылезает 5 warnings.

      • »
        »
        »
        »
        11 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        clang не могу с ходу попробовать... а g++ у тебя как? Кстати, ты под какой операционкой? Вроде бы у тебя linux был, так под ним все работает, да =) Я без -Werror компилю. Паша мне уже посоветовал откатиться до стабильно 0.9.5. Так вот, компилирую ее, ошибки под винду после g++ -std=c++11 testlib.h:

        In file included from c:\soft\msys\include\fcntl.h:37:0, from testlib.h:141: c:\soft\msys\include\io.h:301:14: error: 'off64_t' does not name a type __CRT_INLINE off64_t lseek64 (int, off64_t, int); ^ c:\soft\msys\include\io.h:302:14: error: 'off64_t' does not name a type __CRT_INLINE off64_t lseek64 (int fd, off64_t offset, int whence) { ^ testlib.h: In function 'void __testlib_set_binary(FILE*)': testlib.h:346:30: error: '_fileno' was not declared in this scope _setmode(_fileno(file), O_BINARY); ^ ``

        Под мак, оказалось, что версия g++ 4.2, ошибка после g++ -std=c++98 testlib.h:

        testlib.h:2970: error: wrong number of arguments specified for ‘deprecated’ attribute testlib.h:2970: error: wrong number of arguments specified for ‘deprecated’ attribute testlib.h:3234: warning: ‘error’ attribute directive ignored testlib.h:3248: warning: ‘error’ attribute directive ignored testlib.h:3262: warning: ‘error’ attribute directive ignored

        • »
          »
          »
          »
          »
          11 лет назад, # ^ |
          Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится

          g++-4.{6.4,8.1} тоже скомпилил, операционка ubuntu. Warnings выдаются такие clang:


          ./testlib.h:341:45: warning: unused parameter 'file' [-Wunused-parameter] static void __testlib_set_binary(std::FILE* file) ^ ./testlib.h:1887:31: warning: unused parameter 'color' [-Wunused-parameter] void InStream::textColor(WORD color) ^ ./testlib.h:3283:17: warning: unknown attribute 'error' ignored [-Wattributes] __attribute__ ((error("Don't use random_shuffle(), use shuffle() instead"))) ^ ./testlib.h:3297:17: warning: unknown attribute 'error' ignored [-Wattributes] __attribute__ ((error("Don't use rand(), use rnd.next() instead"))) ^ ./testlib.h:3308:17: warning: unknown attribute 'error' ignored [-Wattributes] __attribute__ ((error("Don't use srand(), you should use "

          g++ бросает при -Wextra только первые 2.

          Мне кажется или такие вещи на которые компиляторы дают warning должны быть выпелены? =)

          • »
            »
            »
            »
            »
            »
            11 лет назад, # ^ |
            Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

            тьфу, убунта! =) под линуксом все ок. то, о чем я писал в посте, -- mac и windows.

          • »
            »
            »
            »
            »
            »
            11 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится -8 Проголосовать: не нравится

            Очень странные warning.

            Последние три еще хотя бы логичные. Ну не знает он такой атрибут. Другой вопрос, какого черта в clang определена константа __GNUC__.

            Второй ладно. Этот параметр используется только под виндой, и надо бы честно под линуксом написать, что он unused. А первый — какая-то ахинея. Там эту штуку куда-то дальше передают.

            • »
              »
              »
              »
              »
              »
              »
              11 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится

              Что значит какого черта? =) Она там всегда определена.

              Не определён O_BINARY потому и unused.

            • »
              »
              »
              »
              »
              »
              »
              11 лет назад, # ^ |
                Проголосовать: нравится +8 Проголосовать: не нравится

              Clang позиционируется как drop-in замена GCC, поэтому эмулирует его особенности, в том числе __GNUC__.

              • »
                »
                »
                »
                »
                »
                »
                »
                11 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится

                Но какие-то из атрибутов для gcc не умеет. А как их тогда различать?

                • »
                  »
                  »
                  »
                  »
                  »
                  »
                  »
                  »
                  11 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится

                  Вот так:

                  #if defined(__clang__)
                  // Clang
                  #elif defined(__GNUC__)
                  // GCC
                  #else
                  // Other
                  #endif
                  

                  Или так:

                  #if defined(__GNUC__) && !defined(__clang__)
                  // GCC
                  #else
                  // Other
                  #endif
                  
          • »
            »
            »
            »
            »
            »
            11 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

            на которые компиляторы дают warning должны быть выпелены? =)

            +1. Помнишь про "Неугомонный Паша"?)

            UPD: link

            • »
              »
              »
              »
              »
              »
              »
              11 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится

              Вполне возможно это было без меня. Или я был не в состоянии мыслить и запоминать, что происходит.

        • »
          »
          »
          »
          »
          7 лет назад, # ^ |
          Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

          Я не разобрался во всех тонкостях, но тем кто, как я, наткнулся на error: 'off64_t' does not name a type сообщаю, что у меня под MinGW/MSYS достаточно было вместо

          $ g++ --std=c++11

          сказать

          $ g++ --std=gnu++11

          и всё ОК.

»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Извините за оффтоп. На какой программе вы делаете условия задач?