Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.238.76] |
|
Сообщ.
#1
,
|
|
|
Доброй ночи!
Есть проблема. Исходник, который должен компилироваться, только не знаю чем. В коде конструкция: using blabla_t = unsigned int; Насколько я понял, это аналог паскальной конструкции type blabla = longword; Запихнул исходник в проект под Visual Studio. Компилятор матерится: Цитата error C2143: синтаксическая ошибка: отсутствие ";" перед "=" error C2873: blabla_t: использование символа в "using"-объявлении не допускается error C2513: int: нет переменных, объявленных перед "=" error C2062: тип "unsigned int" не требуется Что с этим кодом не так? Мне конечно ума хватит убрать переназвание типа и использовать везде unsigned int напрямую, но подобных ошибок далее по тексту еще десяток, и весь код переписывать нет никакого желания. Проект был создан как Visual C++ - общие - пустой проект. |
Сообщ.
#2
,
|
|
|
Эта конструкция для c++11 и далее. Для ранних же стандартов - компилятор ее не понимает.
|
Сообщ.
#3
,
|
|
|
Виталь, в С и старых версиях C++ нужное тебе пишется так
typedef unsigned int blabla_t; |
Сообщ.
#4
,
|
|
|
Ох и понапридумывали же конструкций. Спасибо, буду знать.
Можно еще для полноты картины - начиная с какой версии VS понимает c++11 и с какой c++18 ? Что-то у Майкрософта много воды налито, а сводной таблицы в понятном виде не нашел. |
Сообщ.
#6
,
|
|
|
Доброго времени суток!
Вопрос чуть по другой теме, но смежной. auto var123 = std::vector<int>{}; с последующими вызовами var123.push_back Цитата синтаксическая ошибка: отсутствие ";" перед "{" и параметры функции типа uintptr_t ругаются в теле функции при их использовании - "%name_of_var%" нельзя передать неявно, поскольку не задан режим передачи по умолчанию - это всё какой стандарт языка? Какая минимум студия нужна для того чтобы это откомпилировать? Говорю минимум потому что под эту задачу буду подымать отдельную виртуальную машину с виндой, и чем меньше гигабайт мусора буду ставить - тем быстрее решу поставленную задачу. |
Сообщ.
#7
,
|
|
|
Виталь, приведи участок кода, сделай синтетический пример - иначе маловато информации.
|
Сообщ.
#8
,
|
|
|
Вот кусок кода. Ругается на vector<int>{} (ошибка синтаксическая ошибка: отсутствие ";" перед "{") и на if (var2 && var3) (нельзя передать неявно, поскольку не задан режим передачи по умолчанию)
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, ¤t, 16)); } return var123; }; if (var2 && var3) { ... } ... } Хочу знать чем компилировать. 2010я Студия его не берет. Ставить тупо 2019 не хочу - нужен большой виртуальный диск и качать образ на 30+ Гб, да еще и окажется что на Windows 7 она не пойдет (последняя мода от Microsoft) и придется начинать с установки Windows 10 на виртуализацию, она сама по себе будет жестко тормозить. Образ каждой последующей версии Студии в несколько раз тяжелее предыдущей (винды - тоже). |
Сообщ.
#9
,
|
|
|
Цитата Виталь @ auto var123 = std::vector<int>{}; Это какое-то бесполезное использование auto. В данном случае оно ничего не сокращает. Пиши тупо std::vector<int> var123; и всё |
Сообщ.
#10
,
|
|
|
Внезапно.
Цитата fatal error C1001: Внутренняя ошибка в файле компилятора. (файл компилятора "msc1.cpp", строка 1420) Причина - const char* name HMODULE handle = GetModuleHandleA(name); В оригинале был GetModuleHandle, но он выдает error C2664: GetModuleHandleW: невозможно преобразовать параметр 1 из "const char *" в "LPCWSTR" (независимо от того, стоит ли в свойствах использование юникода) Оказывается, компилятор может падать. За всю историю использования Borland Delphi - ни разу такого не видел |
Сообщ.
#11
,
|
|
|
Цитата Виталь @ Пример кода неверный. Плохо соответствует реальному. Сделай, плз, ещё раз, но без ошибок. Если судить по тексту сообщения, то этот if() должен быть внутри лябмды, но там даже лямбда неправильно определена, её по сути нет. Компилер должен был бы стопнуться ещё на её заголовке.Вот кусок кода Цитата Виталь @ Так не бывает. Значит ты либо неправильно сказал использовать ANSI, либо подключил не те заголовки, если они от какой-нибудь сторонней либы, либо эта либа просто расчитана исключительно на юникод В оригинале был GetModuleHandle, но он выдает error C2664: GetModuleHandleW: невозможно преобразовать параметр 1 из "const char *" в "LPCWSTR" (независимо от того, стоит ли в свойствах использование юникода) Добавлено Цитата 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 обоих разрядностей. |
Сообщ.
#12
,
|
|
|
По поводу "странных" ошибок. Да, ты пытаешься относительно новые фишки языка использовать с древним компилятором, да еще и с необычным синтаксисом. При этом не самым удачным. Вон OpenGL написал как надо. Хотя твоя конструкция "съедается" компилятором, по крайней мере с++14, но она неоптимальна.
Цитата Виталь @ Ставить тупо 2019 не хочу - нужен большой виртуальный диск и качать образ на 30+ Гб, да еще и окажется что на Windows 7 она не пойдет (последняя мода от Microsoft) и придется начинать с установки Windows 10 на виртуализацию, она сама по себе будет жестко тормозить. А вот тут тебе присоветую, т.к. сам развернул среду разработки под Win7-x64. Не нужна тебе студия 2019, тебе нужно оттуда только компиляторы, линкеры и сопровождающий утиль. Поэтому делай следующим образом и обязательно в этом порядке: К примеру, мои наборы: ЗЫ: По поводу образа образа виртуального диска, чтобы не гадать, и чтобы потом не было мучительно больно в процессе установки и настройки ... Делай диск динамического размещения с указанием стартового размера не менее 30G. После установки/настройки - дефрагментация и сжатие. И все акеюшки ЗЗЫ: Забыл!!! перед установкой лучше всего снести все версии MS C++ Redistributable, потом нужно доставить обратно. У меня 2019 M$ Build Tools при установке вылетал с ошибкой, пока я на предварительно не снес установленные. |
Сообщ.
#13
,
|
|
|
Qt-то ему зачем, JoeUser?
|
Сообщ.
#14
,
|
|
|
Цитата Qraizer @ Qt-то ему зачем, JoeUser? Ну QtCraeator, как среда разработки - супер, и гораздо легче студии. При это на отличненько автоконфигурируется - самостоятельно находит компиляторы, отладчики, системы сборки ... Но просто сейчас отдельного инсталлятора QtCreator'а нет, он идет как часть всей поставки Qt5. Тут парится не следует - онлайн-инсталлятор весит мегабайты. В нем только убрать все (ну или чего-то оставить) и выбрать QtCreator ... ну и все. Не, можно конечно поставить что-то типа Atom'а, Visual Code, NetBeans - но это жЫрные скотины, тогда уж лучше студию. |
Сообщ.
#15
,
|
|
|
Цитата Виталь @ Уберите точку с запятой в конце строки и все у вас получится. static auto var5 = [](const char* var6); |
Сообщ.
#16
,
|
|
|
Цитата уберите точку с запятой в конце строки и все у вас получится Уже убрал. Была ошибка не хватает ; - я почему-то подумал что на этой строке. Это не я пытаюсь, код не мой, он короткий, мне нужно убедиться что решение имеет место существовать (в оригинале, потому что заявлено как рабочее) и воспроизвести его на привычном мне языке программирования. Принцип реализации я понял, но хочу сначала убедиться что оригинал работает. Я эти Цитата имел в виду во всех смыслах этого слова, С++ никогда не славился совместимостью между компиляторами, некоторые баги (или фишки) популярных компиляторов даже были темой олимпиадных задач в студенческие годы. Так теперь развелось десяток стандартов языка, и одни компиляторы не понимают код, написанный под другими. И вещь не связана ни с чем критически важным, как например разница между Delphi 7 и более новыми версиями (переход на юникод), просто раньше был один способ реализации какого-то кода или объявления какой-то структуры, а сейчас их 10 разных, из которых половина понимается только MSVS и только последними версиями...относительно новые фишки языка Цитата Пример кода неверный. Плохо соответствует реальному Я только переименовал переменные и убрал куски кода между {} к которым не возникают вопросы. Цитата Это очень полезная информация. Видимо, буду так делать. Потому как у меня есть готовая виртуалка с семеркой, но когда я на нее пытался ставить очередную дрянь, вылезла неудовлетворенная зависимость (последний .NET) который нагло отказывался ставиться (а код ошибки, судя по китайскому интернету, говорил о том что не хватает одного из "важных" обновлений винды). Пришлось тогда откатывать и создавать еще одну семерку, с образа с RuTracker, в котором все обновления вшиты (что там еще интересного вшито - не смотрел).VS2019 всё ещё умеет работать на любых Win7 с SP1 Цитата Их, скорее всего, не будет. ОК. лучше всего снести все версии MS C++ Redistributable |
Сообщ.
#17
,
|
|
|
Виталь, C++ прошло периоды застоя! Хочешь ты этого,не хочешь - но ты, если прогаешь на С++, обязан отслеживать стандарты! Очень часто есть перелет из "std::experemental" в "std::".
Цитата Виталь @ имел в виду во всех смыслах этого слова, С++ никогда не славился совместимостью между компиляторами, некоторые баги (или фишки) популярных компиляторов даже были темой олимпиадных задач в студенческие годы. Еще раз!!! Пользуешь "фичу языка" - удостоверься, что твой компайлер тянет этот стандарт. |
Сообщ.
#18
,
|
|
|
Отнюдь, Dushevny. Даже если он так сделает, лямбда кончается раньше использования var2 и var3, и ругаться компилятор не должен. Но ругается, значит этот пример кода не соответствует оригинальному. То ли сама func1() тоже лямбда, то ли баланс {} где-то нарушен, то ли перепутаны переменные. А попробуй не перепутать, когда они называются одинаково и внутри, и снаружи. Очень напрягают const_cast<>ы. Я не вижу использования лямбды и следовательно нет никакой информации о константности её параметра, но даже так выходит, что реализация её контракта грубейшим образом нарушает собственные же гарантии. Тело цикла по current меняет свой параметр вне заголовка. И как будто этого мало, грубым образом нарушая контракты strtoul(): второй параметр неконстантный, первый константный, и когда они совпадают, для strtoul() это может оказаться полной неожиданностью, это прекрасный способ пострелять по конечностям. И что делает C-шная функция, не умеющая к тому же корректно сообщать об ошибках, в плюсовом коде? Почему не std::stoul()?
Код вроде бы под давние фишки языка, которым 10 лет в обед, но написан безалаберно. 100пудово индус писал. Если Виталь его портирует, пусть хоть в порядок приведёт, чтоб работало не на соплях. Добавлено Цитата Виталь @ Не слушай ничьих бредней. Есть Стандарт языка, и он одинаков для всех. Некоторые компиляторы, существующие на рынке десятки лет, могут поддерживать старые Стандартные решения для совместимости со старыми программными продуктами, но такое обычно настраивается. Другое дело, что компиляторы могут также вводить некие расширения Стандарта. Они естественно могут не поддерживаться другими компиляторами. Но на то они и расширения. Если хочешь портабельности, расширения языка в коде использовать нужно ограниченно и локализовано, а не где попало по всему коду. Так теперь развелось десяток стандартов языка, и одни компиляторы не понимают код, написанный под другими. Добавлено Цитата Виталь @ Ну, 10 — это ты загнул. Нынче строку в число преобразовать можно тремя Плюсовыми способами и тремя (по Стандарту – двумя) Cшными. Каждый имеет свои плюсы и минусы. std::stringstream удобнейший, включая поддержку национальных предпочтений, но накладный, std::num_get<> неудобный, но значительно быстрее, строковые std::stoXX() самые быстрые, но работают только в C locale classic. Выбирай на вкус, что называется. Cшные по-любому нерекомендованы из-за типовой небезопасности и ненадёжной индикации ошибок. "Только MSVS" означает скорее всего лишь то, что код завязан на MSные расширения языка. Хорошо это или плохо, сказать трудно; однозначно плохо, когда использующий их программер не отличает их от Стандартных конструкций. Если ты думаешь, что у GNU меньше расширений, то вынужден огорчить, их там ещё больше, чем у MS. просто раньше был один способ реализации какого-то кода или объявления какой-то структуры, а сейчас их 10 разных, из которых половина понимается только MSVS и только последними версиями... Добавлено Цитата Виталь @ Дома на 10-ой ПРОшке проблем с 2017-ой точно нет. На работе стоит корпоративная 7-ка, и там она тоже как влитая работает без нареканий. 2017-ая тоже нынче поддерживает C++17 отлично (не буду говорить "безукоризненно", боюсь соврать), так что и она вполне, думаю, тебе подойдёт. За 2019 ничего сказать не могу, не юзал, но однозначно не должна быть хуже, и я почти уверен, что почти готовый C++20 в 2017 если и поддержат, то развивать точно не будут. Это очень полезная информация. Видимо, буду так делать. Потому как у меня есть готовая виртуалка с семеркой... |
Сообщ.
#19
,
|
|
|
Цитата Qraizer @ Не слушай ничьих бредней. Есть Стандарт языка, и он одинаков для всех. Категорически не согласен - не слушай его!!! Мы имеем Стандарт в виде "нотаций", а-ля "будет так". А компиляторы, со своими реализациями - мы имеем в виде данности! Используя тот или иной компилятор (его версию) ты пассивно соглашаешься на использования "ЧАСТИ СТАНДАРТА" (а может и полной, а может и нет) который он декларирует! Может все, а может и не все. И Мелкомягкие - не всегда в тренде! |
Сообщ.
#20
,
|
|
|
Пошел качать 2017й. Ну это просто негативный опыт компиляции чужих кодов. Еще лет 10-15 назад "код из интернета" на С или С++ пытался скомпилировать в каком-то MSVC, Symantec C++, GCC и чем-то еще и ничего не получилось. Потом более-менее освоил студию 2008 и 2010 - в них хотя бы можно работать и были проекты с открытыми исходниками, которые без танцев с бубном собирались на этих версиях (я мог вносить правки и собирать под себя). Сейчас бывает что-то на плюсах или шарпах попробую в 2010й или Bloodshed Dev-C++. Другими не пользуюсь, ну не нужно оно мне. А вот эта мода новая публиковать исходники где-то там, на форумах либо гитхабах, и либо файл проекта отсутствует (не понятно на чем оно писалось) либо он сделан на последней студии, и его невозможно конвертировать в 2010й (или есть какой-то софт для преобразования SLN и vcxproj файлов в обе стороны, а не только снизу вверх?)
|
Сообщ.
#21
,
|
|
|
Цитата Qraizer @ От лишней точки с запятой компилятору может снести голову по-разному и он может вывалить кучу совершенно непонятной чуши, никак не связанной с настоящей ошибкой. А var2 и var3 передаются параметрами в охватывающую функцию func1(), так что вполне могут использоваться после тела лямбды, я даже не стал вдумываться в смысл сообщений о них. Это я к тому, что надо сначала убрать явные ошибки, а потом бороться с хитрыми (если они не пропадут). Отнюдь, Dushevny. Даже если он так сделает, лямбда кончается раньше использования var2 и var3, и ругаться компилятор не должен. |
Сообщ.
#22
,
|
|
|
Цитата Виталь @ Пошел качать 2017й. Зря! Почитал бы, что я тебе написал, надо 2019 ... Потом "не плачься что не работает". |
Сообщ.
#23
,
|
|
|
Посмотрим что выйдет. В связи с тем, что на раздаче мало людей - быстрее всего качается 2015й. Место на винте есть, качаются все 3 сразу (+2017 и 2019). Надеюсь, в установщике не будет такого идиотизма как в последних версиях Delphi RAD Studio, когда весь установщик сначала распаковывается в Temp, потом устанавливается в выбранную директорию (не переносом, а копированием, при этом половина объема всё равно лезет в Program Files, хотя для установки выбирался другой диск) и только после окончания установки очищается Temp)
|
Сообщ.
#24
,
|
|
|
Цитата Виталь @ Посмотрим что выйдет. В связи с тем, что на раздаче мало людей - быстрее всего качается 2015й. Место на винте есть, качаются все 3 сразу (+2017 и 2019). Надеюсь, в установщике не будет такого идиотизма как в последних версиях Delphi RAD Studio, когда весь установщик сначала распаковывается в Temp, потом устанавливается в выбранную директорию (не переносом, а копированием, при этом половина объема всё равно лезет в Program Files, хотя для установки выбирался другой диск) и только после окончания установки очищается Temp) Такое ощущение - что тебе пофиг, что тебе отвечают, время на тебя тратят! Ну и нам на тебя пофиг - плыви дальше. |
Сообщ.
#25
,
|
|
|
Цитата Dushevny @ Собственно в первом моём посту эта же мысль. Это я к тому, что надо сначала убрать явные ошибки, а потом бороться с хитрыми (если они не пропадут). Добавлено Цитата Виталь @ Лицензия на 2017 и 2019 разрешает даже организациям с менее чем 250 компов и годовым доходом до $1000000 бесплатно использовать до 5-и установок. На вот, сравни. Качать с торрентов совсем не обязательно. Веб-интсталлер маленький и качает только выбранное. Ставить можно куда угодно, у меня всё стоит на D:, в Program files совсем немного. В связи с тем, что на раздаче мало людей - быстрее всего качается 2015й |
Сообщ.
#26
,
|
|
|
У меня 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; |