На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> синтаксическая ошибка: отсутствие ";" перед "="
    Доброй ночи!
    Есть проблема. Исходник, который должен компилироваться, только не знаю чем. В коде конструкция:
    ExpandedWrap disabled
      using blabla_t = unsigned int;
    , ниже этим типом объявлено одно из полей в некоторой struct.
    Насколько я понял, это аналог паскальной конструкции type blabla = longword;
    Запихнул исходник в проект под Visual Studio. Компилятор матерится:
    Цитата
    error C2143: синтаксическая ошибка: отсутствие ";" перед "="
    error C2873: blabla_t: использование символа в "using"-объявлении не допускается
    error C2513: int: нет переменных, объявленных перед "="
    error C2062: тип "unsigned int" не требуется

    Что с этим кодом не так? Мне конечно ума хватит убрать переназвание типа и использовать везде unsigned int напрямую, но подобных ошибок далее по тексту еще десяток, и весь код переписывать нет никакого желания. Проект был создан как Visual C++ - общие - пустой проект.
      Эта конструкция для c++11 и далее. Для ранних же стандартов - компилятор ее не понимает.
        Виталь, в С и старых версиях C++ нужное тебе пишется так
        ExpandedWrap disabled
          typedef unsigned int blabla_t;
          Ох и понапридумывали же конструкций. Спасибо, буду знать.
          Можно еще для полноты картины - начиная с какой версии VS понимает c++11 и с какой c++18 ? Что-то у Майкрософта много воды налито, а сводной таблицы в понятном виде не нашел.
              Доброго времени суток!
              Вопрос чуть по другой теме, но смежной.

              ExpandedWrap disabled
                auto var123 = std::vector<int>{};

              с последующими вызовами var123.push_back
              Цитата
              синтаксическая ошибка: отсутствие ";" перед "{"


              и параметры функции типа uintptr_t ругаются в теле функции при их использовании - "%name_of_var%" нельзя передать неявно, поскольку не задан режим передачи по умолчанию - это всё какой стандарт языка?

              Какая минимум студия нужна для того чтобы это откомпилировать? Говорю минимум потому что под эту задачу буду подымать отдельную виртуальную машину с виндой, и чем меньше гигабайт мусора буду ставить - тем быстрее решу поставленную задачу.
                Виталь, приведи участок кода, сделай синтетический пример - иначе маловато информации.
                  Вот кусок кода. Ругается на vector<int>{} (ошибка синтаксическая ошибка: отсутствие ";" перед "{") и на if (var2 && var3) (нельзя передать неявно, поскольку не задан режим передачи по умолчанию)
                  ExpandedWrap disabled
                    uintptr_t func1(const char* var1, uintptr_t var2, uintptr_t var3, int var4)
                    {
                        static auto var5 = [](const char* var6);
                        {
                            auto var123 = std::vector<int>{};
                            auto var2 = const_cast<char*>(var6);
                            auto var3 = const_cast<char*>(var6) + strlen(var6);
                            for (auto current = var2; current < var3; ++current)
                            {
                                if (*current == '?')
                                {
                                    ++current;
                                    ...
                                    var123.push_back(-1);
                                }
                                else
                                    var123.push_back(strtoul(current, &current, 16));
                            }
                            return var123;
                        };
                        if (var2 && var3)
                        {
                            ...
                        }
                        ...
                    }

                  Хочу знать чем компилировать. 2010я Студия его не берет. Ставить тупо 2019 не хочу - нужен большой виртуальный диск и качать образ на 30+ Гб, да еще и окажется что на Windows 7 она не пойдет (последняя мода от Microsoft) и придется начинать с установки Windows 10 на виртуализацию, она сама по себе будет жестко тормозить. Образ каждой последующей версии Студии в несколько раз тяжелее предыдущей (винды - тоже).
                  Сообщение отредактировано: Виталь -
                    Цитата Виталь @
                    auto var123 = std::vector<int>{};

                    Это какое-то бесполезное использование auto. В данном случае оно ничего не сокращает. Пиши тупо std::vector<int> var123; и всё
                      Внезапно.
                      Цитата
                      fatal error C1001: Внутренняя ошибка в файле компилятора. (файл компилятора "msc1.cpp", строка 1420)

                      Причина -
                      ExpandedWrap disabled
                        const char* name
                        HMODULE handle = GetModuleHandleA(name);

                      В оригинале был GetModuleHandle, но он выдает error C2664: GetModuleHandleW: невозможно преобразовать параметр 1 из "const char *" в "LPCWSTR" (независимо от того, стоит ли в свойствах использование юникода)

                      Оказывается, компилятор может падать. За всю историю использования Borland Delphi - ни разу такого не видел :D
                      Сообщение отредактировано: Виталь -
                        Цитата Виталь @
                        Вот кусок кода
                        Пример кода неверный. Плохо соответствует реальному. Сделай, плз, ещё раз, но без ошибок. Если судить по тексту сообщения, то этот if() должен быть внутри лябмды, но там даже лямбда неправильно определена, её по сути нет. Компилер должен был бы стопнуться ещё на её заголовке.
                        Цитата Виталь @
                        В оригинале был GetModuleHandle, но он выдает error C2664: GetModuleHandleW: невозможно преобразовать параметр 1 из "const char *" в "LPCWSTR" (независимо от того, стоит ли в свойствах использование юникода)
                        Так не бывает. Значит ты либо неправильно сказал использовать ANSI, либо подключил не те заголовки, если они от какой-нибудь сторонней либы, либо эта либа просто расчитана исключительно на юникод

                        Добавлено
                        Цитата OpenGL @
                        Это какое-то бесполезное использование auto. В данном случае оно ничего не сокращает. Пиши тупо std::vector<int> var123; и всё
                        Вообще не понимаю апологетов нового стиля инициализаторов. Везде суют {}, что только с толку сбивает.

                        Добавлено
                        P.S. VS2019 всё ещё умеет работать на любых Win7 с SP1. Что касается требуемых объёмов, тот тут всё зависит от набора компонентов. У меня стоит 2017 на ~20Гб, в которые включены базовые средства для C# и VB, отладчик JIT, инструменты статического и динамического анализа, наборы заголовков и библиотек для создания приложений под XP и API в совокупности трёх версий (ещё 7 и 8.1), плагины для полноценной поддержки GPU, библиотеки MFC и ATL (так ни разу и не воспользовался), RTL четырёх вариантов (статические/динамические, релиз/дебаг, естественно включая и упомянутые MFC с ALTем + ешё раз то же самое за ANSI/UNICODE для них) под три целевые исполнительные платформы x32, x64 и ARM с исходниками + беззаголовочные варианты при поддержке модулей, средства разработки под Android и два его эмулятора и Python обоих разрядностей.
                        Сообщение отредактировано: Qraizer -
                          По поводу "странных" ошибок. Да, ты пытаешься относительно новые фишки языка использовать с древним компилятором, да еще и с необычным синтаксисом. При этом не самым удачным. Вон OpenGL написал как надо. Хотя твоя конструкция "съедается" компилятором, по крайней мере с++14, но она неоптимальна.

                          Цитата Виталь @
                          Ставить тупо 2019 не хочу - нужен большой виртуальный диск и качать образ на 30+ Гб, да еще и окажется что на Windows 7 она не пойдет (последняя мода от Microsoft) и придется начинать с установки Windows 10 на виртуализацию, она сама по себе будет жестко тормозить.


                          А вот тут тебе присоветую, т.к. сам развернул среду разработки под Win7-x64. Не нужна тебе студия 2019, тебе нужно оттуда только компиляторы, линкеры и сопровождающий утиль. Поэтому делай следующим образом и обязательно в этом порядке:
                          1. Чтобы не парится с длинными путями, создай сразу себе каталог "C:\Tools", туда и будешь ставить себе все
                          2. Качай MSBuildTools 2019 и устанавливай в п.1 (часть coomon все равно залезет в programm Files, пофик). На странице это: "Все файлы для скачивания"->"Инструменты для Visual Studio 2019"->"Build Tools для Visual Studio 2019". В установщике обязательно выключи поддержку русского, а оставь только английский, позже напишу почему. Эта шляпа займет порядка 4Gb.
                          3. Качай и устанавливай "Пакет SDK для Windows 7 или 10", скорее всего тебе понадобится
                          4. Если хочешь альтернативные компиляторы GCC/Clang на основе MinGW32 - качай и устанавливай MSYS2, а после его установки доустанови нужное из окружения msys2
                          5. Качай и устанавливай python, он часто используется в системах сборки
                          6. Качай и устанавливай cmake (можно как пакет из MSYS2, но смысла нет)
                          7. Последним этапом ставь QtCreator (выбирай Qt5 opensource инсталлер, и в нем тока QtCreator). При первом старте QtCreator должен полностью автоматически обнаружить все компиляторы, отладчики, системы сборки и автосконфигурироваться. А выключение русского в п.2 даст тебе нормальные сообщения без крокозябов.

                          К примеру, мои наборы:

                          user posted image

                          ЗЫ: По поводу образа образа виртуального диска, чтобы не гадать, и чтобы потом не было мучительно больно в процессе установки и настройки ... Делай диск динамического размещения с указанием стартового размера не менее 30G. После установки/настройки - дефрагментация и сжатие. И все акеюшки :)

                          ЗЗЫ: Забыл!!! перед установкой лучше всего снести все версии MS C++ Redistributable, потом нужно доставить обратно. У меня 2019 M$ Build Tools при установке вылетал с ошибкой, пока я на предварительно не снес установленные.
                            Qt-то ему зачем, JoeUser?
                              Цитата Qraizer @
                              Qt-то ему зачем, JoeUser?

                              Ну QtCraeator, как среда разработки - супер, и гораздо легче студии. При это на отличненько автоконфигурируется - самостоятельно находит компиляторы, отладчики, системы сборки ... Но просто сейчас отдельного инсталлятора QtCreator'а нет, он идет как часть всей поставки Qt5. Тут парится не следует - онлайн-инсталлятор весит мегабайты. В нем только убрать все (ну или чего-то оставить) и выбрать QtCreator ... ну и все.

                              Не, можно конечно поставить что-то типа Atom'а, Visual Code, NetBeans - но это жЫрные скотины, тогда уж лучше студию.
                                Цитата Виталь @
                                static auto var5 = [](const char* var6);
                                Уберите точку с запятой в конце строки и все у вас получится.
                                  Цитата
                                  уберите точку с запятой в конце строки и все у вас получится

                                  Уже убрал. Была ошибка не хватает ; - я почему-то подумал что на этой строке.

                                  Это не я пытаюсь, код не мой, он короткий, мне нужно убедиться что решение имеет место существовать (в оригинале, потому что заявлено как рабочее) и воспроизвести его на привычном мне языке программирования. Принцип реализации я понял, но хочу сначала убедиться что оригинал работает.

                                  Я эти
                                  Цитата
                                  относительно новые фишки языка
                                  имел в виду во всех смыслах этого слова, С++ никогда не славился совместимостью между компиляторами, некоторые баги (или фишки) популярных компиляторов даже были темой олимпиадных задач в студенческие годы. Так теперь развелось десяток стандартов языка, и одни компиляторы не понимают код, написанный под другими. И вещь не связана ни с чем критически важным, как например разница между Delphi 7 и более новыми версиями (переход на юникод), просто раньше был один способ реализации какого-то кода или объявления какой-то структуры, а сейчас их 10 разных, из которых половина понимается только MSVS и только последними версиями...

                                  Цитата
                                  Пример кода неверный. Плохо соответствует реальному

                                  Я только переименовал переменные и убрал куски кода между {} к которым не возникают вопросы.

                                  Цитата
                                  VS2019 всё ещё умеет работать на любых Win7 с SP1
                                  Это очень полезная информация. Видимо, буду так делать. Потому как у меня есть готовая виртуалка с семеркой, но когда я на нее пытался ставить очередную дрянь, вылезла неудовлетворенная зависимость (последний .NET) который нагло отказывался ставиться (а код ошибки, судя по китайскому интернету, говорил о том что не хватает одного из "важных" обновлений винды). Пришлось тогда откатывать и создавать еще одну семерку, с образа с RuTracker, в котором все обновления вшиты (что там еще интересного вшито - не смотрел).

                                  Цитата
                                  лучше всего снести все версии MS C++ Redistributable
                                  Их, скорее всего, не будет. ОК.
                                  Сообщение отредактировано: Виталь -
                                    Виталь, C++ прошло периоды застоя! Хочешь ты этого,не хочешь - но ты, если прогаешь на С++, обязан отслеживать стандарты! Очень часто есть перелет из "std::experemental" в "std::".

                                    Цитата Виталь @
                                    имел в виду во всех смыслах этого слова, С++ никогда не славился совместимостью между компиляторами, некоторые баги (или фишки) популярных компиляторов даже были темой олимпиадных задач в студенческие годы.

                                    Еще раз!!! Пользуешь "фичу языка" - удостоверься, что твой компайлер тянет этот стандарт.
                                      Отнюдь, Dushevny. Даже если он так сделает, лямбда кончается раньше использования var2 и var3, и ругаться компилятор не должен. Но ругается, значит этот пример кода не соответствует оригинальному. То ли сама func1() тоже лямбда, то ли баланс {} где-то нарушен, то ли перепутаны переменные. А попробуй не перепутать, когда они называются одинаково и внутри, и снаружи. Очень напрягают const_cast<>ы. Я не вижу использования лямбды и следовательно нет никакой информации о константности её параметра, но даже так выходит, что реализация её контракта грубейшим образом нарушает собственные же гарантии. Тело цикла по current меняет свой параметр вне заголовка. И как будто этого мало, грубым образом нарушая контракты strtoul(): второй параметр неконстантный, первый константный, и когда они совпадают, для strtoul() это может оказаться полной неожиданностью, это прекрасный способ пострелять по конечностям. И что делает C-шная функция, не умеющая к тому же корректно сообщать об ошибках, в плюсовом коде? Почему не std::stoul()?
                                      Код вроде бы под давние фишки языка, которым 10 лет в обед, но написан безалаберно. 100пудово индус писал. Если Виталь его портирует, пусть хоть в порядок приведёт, чтоб работало не на соплях.

                                      Добавлено
                                      Цитата Виталь @
                                      Так теперь развелось десяток стандартов языка, и одни компиляторы не понимают код, написанный под другими.
                                      Не слушай ничьих бредней. Есть Стандарт языка, и он одинаков для всех. Некоторые компиляторы, существующие на рынке десятки лет, могут поддерживать старые Стандартные решения для совместимости со старыми программными продуктами, но такое обычно настраивается. Другое дело, что компиляторы могут также вводить некие расширения Стандарта. Они естественно могут не поддерживаться другими компиляторами. Но на то они и расширения. Если хочешь портабельности, расширения языка в коде использовать нужно ограниченно и локализовано, а не где попало по всему коду.

                                      Добавлено
                                      Цитата Виталь @
                                      просто раньше был один способ реализации какого-то кода или объявления какой-то структуры, а сейчас их 10 разных, из которых половина понимается только MSVS и только последними версиями...
                                      Ну, 10 — это ты загнул. Нынче строку в число преобразовать можно тремя Плюсовыми способами и тремя (по Стандарту – двумя) Cшными. Каждый имеет свои плюсы и минусы. std::stringstream удобнейший, включая поддержку национальных предпочтений, но накладный, std::num_get<> неудобный, но значительно быстрее, строковые std::stoXX() самые быстрые, но работают только в C locale classic. Выбирай на вкус, что называется. Cшные по-любому нерекомендованы из-за типовой небезопасности и ненадёжной индикации ошибок. "Только MSVS" означает скорее всего лишь то, что код завязан на MSные расширения языка. Хорошо это или плохо, сказать трудно; однозначно плохо, когда использующий их программер не отличает их от Стандартных конструкций. Если ты думаешь, что у GNU меньше расширений, то вынужден огорчить, их там ещё больше, чем у MS.

                                      Добавлено
                                      Цитата Виталь @
                                      Это очень полезная информация. Видимо, буду так делать. Потому как у меня есть готовая виртуалка с семеркой...
                                      Дома на 10-ой ПРОшке проблем с 2017-ой точно нет. На работе стоит корпоративная 7-ка, и там она тоже как влитая работает без нареканий. 2017-ая тоже нынче поддерживает C++17 отлично (не буду говорить "безукоризненно", боюсь соврать), так что и она вполне, думаю, тебе подойдёт. За 2019 ничего сказать не могу, не юзал, но однозначно не должна быть хуже, и я почти уверен, что почти готовый C++20 в 2017 если и поддержат, то развивать точно не будут.
                                        Цитата Qraizer @
                                        Не слушай ничьих бредней. Есть Стандарт языка, и он одинаков для всех.

                                        Категорически не согласен - не слушай его!!! Мы имеем Стандарт в виде "нотаций", а-ля "будет так". А компиляторы, со своими реализациями - мы имеем в виде данности! Используя тот или иной компилятор (его версию) ты пассивно соглашаешься на использования "ЧАСТИ СТАНДАРТА" (а может и полной, а может и нет) который он декларирует! Может все, а может и не все. И Мелкомягкие - не всегда в тренде!
                                          Пошел качать 2017й. Ну это просто негативный опыт компиляции чужих кодов. Еще лет 10-15 назад "код из интернета" на С или С++ пытался скомпилировать в каком-то MSVC, Symantec C++, GCC и чем-то еще и ничего не получилось. Потом более-менее освоил студию 2008 и 2010 - в них хотя бы можно работать и были проекты с открытыми исходниками, которые без танцев с бубном собирались на этих версиях (я мог вносить правки и собирать под себя). Сейчас бывает что-то на плюсах или шарпах попробую в 2010й или Bloodshed Dev-C++. Другими не пользуюсь, ну не нужно оно мне. А вот эта мода новая публиковать исходники где-то там, на форумах либо гитхабах, и либо файл проекта отсутствует (не понятно на чем оно писалось) либо он сделан на последней студии, и его невозможно конвертировать в 2010й (или есть какой-то софт для преобразования SLN и vcxproj файлов в обе стороны, а не только снизу вверх?)
                                            Цитата Qraizer @
                                            Отнюдь, Dushevny. Даже если он так сделает, лямбда кончается раньше использования var2 и var3, и ругаться компилятор не должен.
                                            От лишней точки с запятой компилятору может снести голову по-разному и он может вывалить кучу совершенно непонятной чуши, никак не связанной с настоящей ошибкой. А var2 и var3 передаются параметрами в охватывающую функцию func1(), так что вполне могут использоваться после тела лямбды, я даже не стал вдумываться в смысл сообщений о них. Это я к тому, что надо сначала убрать явные ошибки, а потом бороться с хитрыми (если они не пропадут).
                                            Сообщение отредактировано: Dushevny -
                                              Цитата Виталь @
                                              Пошел качать 2017й.

                                              Зря! Почитал бы, что я тебе написал, надо 2019 ... Потом "не плачься что не работает".
                                                Посмотрим что выйдет. В связи с тем, что на раздаче мало людей - быстрее всего качается 2015й. Место на винте есть, качаются все 3 сразу (+2017 и 2019). Надеюсь, в установщике не будет такого идиотизма как в последних версиях Delphi RAD Studio, когда весь установщик сначала распаковывается в Temp, потом устанавливается в выбранную директорию (не переносом, а копированием, при этом половина объема всё равно лезет в Program Files, хотя для установки выбирался другой диск) и только после окончания установки очищается Temp)
                                                Сообщение отредактировано: Виталь -
                                                  Цитата Виталь @
                                                  Посмотрим что выйдет. В связи с тем, что на раздаче мало людей - быстрее всего качается 2015й. Место на винте есть, качаются все 3 сразу (+2017 и 2019). Надеюсь, в установщике не будет такого идиотизма как в последних версиях Delphi RAD Studio, когда весь установщик сначала распаковывается в Temp, потом устанавливается в выбранную директорию (не переносом, а копированием, при этом половина объема всё равно лезет в Program Files, хотя для установки выбирался другой диск) и только после окончания установки очищается Temp)

                                                  Такое ощущение - что тебе пофиг, что тебе отвечают, время на тебя тратят!
                                                  Ну и нам на тебя пофиг - плыви дальше.
                                                    Цитата Dushevny @
                                                    Это я к тому, что надо сначала убрать явные ошибки, а потом бороться с хитрыми (если они не пропадут).
                                                    Собственно в первом моём посту эта же мысль.

                                                    Добавлено
                                                    Цитата Виталь @
                                                    В связи с тем, что на раздаче мало людей - быстрее всего качается 2015й
                                                    Лицензия на 2017 и 2019 разрешает даже организациям с менее чем 250 компов и годовым доходом до $1000000 бесплатно использовать до 5-и установок. На вот, сравни. Качать с торрентов совсем не обязательно. Веб-интсталлер маленький и качает только выбранное. Ставить можно куда угодно, у меня всё стоит на D:, в Program files совсем немного.
                                                    Сообщение отредактировано: Qraizer -
                                                      У меня MSVC 2019 стоит на ПЛАНШЕТЕ на Intel Atom-е с 2 Гб оперативкой, Win10 и диском 30Гб, пришлось еще воткнуть внешний носитель SD Card на 64Гб.
                                                      Полет нормальный.

                                                      Цитата Виталь @
                                                      В оригинале был GetModuleHandle, но он выдает error C2664: GetModuleHandleW: невозможно преобразовать параметр 1 из "const char *" в "LPCWSTR" (независимо от того, стоит ли в свойствах использование юникода)

                                                      В оригинале так же должно быть:
                                                      TCHAR* name;
                                                      HMODULE handle = GetModuleHandle(name);
                                                      Так как он правильно ругается: невозможно преобразовать параметр 1 из "const char *" в "LPCWSTR"
                                                      Либо (если всегда пишешь в юникоде):
                                                      wchar_t* name;
                                                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                      0 пользователей:


                                                      Рейтинг@Mail.ru
                                                      [ Script execution time: 0,0816 ]   [ 17 queries used ]   [ Generated: 19.04.24, 00:48 GMT ]