Как игнорировать ошибки в visual studio

Обновлено: 07.07.2024

Я использую библиотеку из CGAL, которая на этапе компоновки моего кода создает множество предупреждений о связывании этой формы:

Как отключить это конкретное предупреждение компоновщика в Visual C++ / Studio 2008?

добавить следующее в качестве дополнительной опции компоновщика:

это в свойствах - > Компоновщик - > Командная строка

вы не можете отключить конкретные предупреждения.

по данным Джефф Чеппел предупреждение 4099 обрабатывается так, как будто его слишком важно игнорировать, даже используя в сочетании с /wx (который будет рассматривать предупреждения как ошибки и игнорировать указанное предупреждение в других ситуациях)

вот соответствующий текст из ссылки:

Не Совсем Неприличные Предупреждения

для некоторых предупреждающих номеров, спецификация в опции / ignore является принято, но не обязательно действует. Если возникает предупреждение в то время как параметр /WX не активна, то предупреждение все равно отображается, но если параметр /wx активен, то предупреждение игнорируемый. Это как если бы предупреждение считалось достаточно важным, чтобы переопределите попытку игнорировать его, но не если пользователь тоже поставил высокая цена на непризнанные предупреждения.

следующий номер предупреждение пострадавших:

(для записи и до того, как поток исчезнет на форумах msdn) Вы не можете отключить предупреждение (по крайней мере, в VS2010), потому что оно находится в списке предупреждений, которые не могут быть отключены (поэтому /wd4099 не будет работать), но вместо этого вы можете сделать patch link.exe (обычно C:\Program файлы (x86)\Microsoft Visual Studio 10.0\VC\bin\link.exe), чтобы удалить его из указанного списка . Звучит как отбойный молоток, я знаю. Но это работает.

например, если вы хотите снять предупреждение для 4099, откройте ссылку.exe с шестнадцатеричным редактором, goto line 15A0 который читает 03 10 (little endian for 4099) и заменяет его на FF 00 (который не существует.)

для пользы других, я бы включил то, что я сделал.

поскольку вы не можете заставить Visual Studio (2010 в моем случае) игнорировать предупреждения LNK4204, мой подход состоял в том, чтобы дать ему то, что он хотел: файлы pdb. Поскольку я использовал библиотеки с открытым исходным кодом в моем случае, у меня уже есть код, создающий файлы pdb.

но по умолчанию все файлы PDF называются одинаково: vc100.pdb в моем случае. Как вам нужно .pdb для каждого .Либ, это создает проблема, особенно если вы используете что-то вроде ImageMagik, который создает около 20 статических .lib-файлы. Вы не можете иметь 20 lib-файлов в одном каталоге (который ссылки компоновщика вашего приложения на ссылку в библиотеках) и иметь все 20 .pdb-файлы называются так же.

мое решение состояло в том, чтобы пойти и перестроить мои статические файлы библиотеки и настроить VS2010 для имени .pdb файл относительно проекта. Сюда, каждый .lib получает аналогичное имя .pdb, и вы можете положить все либы и файлы в одном каталоге для вашего проекта, чтобы использовать.

Итак, для конфигурации "Debug" я отредактировал:

Свойства - > Свойства Конфигурации - > C / C++ - > Выходные Файлы - > Имя Файла Базы Данных Программы С

$(IntDir) vc$(PlatformToolsetVersion).ГКБ

иметь следующее значение:

$(OutDir)vc$(PlatformToolsetVersion) D$(ProjectName).ГКБ

сейчас, а не где-то в промежуточный каталог, the .pdb-файлы записываются в каталог, где .lib файлы также пишутся, и самое главное, они называются с суффиксом D+название проекта. Это означает, что каждая библиотека проект продуцирует проект .lib и конкретный проект .распределительная плата.

теперь я могу скопировать весь мой релиз .lib файлы, моя отладка .lib-файлы и отладки .pdb-файлы в одном месте в моей системе разработки и проект, который использует эта сторонняя библиотека в режиме отладки имеет файлы pdb, которые ей нужны в режиме отладки.

файл PDB обычно используется для хранения отладочной информации. Это предупреждение вызвано, вероятно, потому, что файл vc80.pdb не найден при связывании целевого объектного файла. Прочитайте запись MSDN на LNK4099 здесь.

кроме того, можно отключить генерацию отладочной информации в поле свойства проекта > Компоновщик > отладка > создать отладочную информацию.

EDIT: не используйте vc80 / Visual Studio 2005, Но версии Visual Studio 2008 / vc90 библиотеки CGAL (возможно Сздесь).

Linker Tools предупреждение LNK4099:

вы также можете скомпилировать с /Z7, так что pdb не нужно использовать, или удалите параметр компоновщика /DEBUG, если вы не имею .pdb файлы для объектов вы связываете.

FAIL

Обычная ситуация: вы написали кусок безупречно правильного кода, но Visual C++ выдает на нем предупреждение. Часто можно немного переписать код, чтобы предупреждение ушло, но не всегда, и тогда выход один – глушить выдачу этого предупреждения.

Рассмотрим, какие возможности для этого есть в Visual C++ и какие ошибки допускают при их использовании.

Следующая возможность – запретить предупреждение в настройках проекта на уровне файла. Этот способ еще хуже предыдущего. Во-первых, предупреждение будет заглушено на всю единицу трансляции, т.е. в этом файле и всех заголовках, которые он включает. Во-вторых, точно те же проблемы с копированием кода, что и в прошлый раз. В третьих, как только в проекте оказывается больше нескольких файлов, вероятность потерять эту настройку при конверсии проекта под более новую версию Visual C++ становится равной чуть менее, чем единице.

… и остаются очень довольны собой. Предупреждение заглушили, код написали, предупреждение восстановили. Прибыль.

1. устанавливает предупреждению уровень по умолчанию и
2. включает предупреждение.

Сначала уровни. В Visual C++ с каждым предупреждением связано число от 1 до 4 – это уровень предупреждения. Предупреждения уровня 1 считаются более серьезными, с ростом уровня серьезность якобы снижается. У каждого предупреждения есть уровень по умолчанию. Конструкция

устанавливает предупреждению указанный в ней уровень и включает предупреждение, т.е. уровень не прибит гвоздями, его можно поменять.

У компилятора есть настройка, с какого уровня предупреждения показывать, Warning Level. При значении этой настройки, равном A, предупреждение в конкретной строке кода показывается только в том случае, если оно там разрешено и его уровень составляет A или ниже.

Кроме того, в Visual C++ часть предупреждений по умолчанию выключена, потому что они выдаются даже в самом безобидном коде и все от них устали. Пусть каждый, кто собирается возмутиться самой идеей точечного подавления конкретного предупреждения, для начала осознает и прочувствует этот факт.

Зачем он это делает, если предупреждение и так выключено? Список предупреждений, выключенных по умолчанию, меняется от одной версии Visual C++ к другой – в него понемногу добавляются предупреждения. Если код изначально писали для Visual C++ 7, а там C9001 по умолчанию было включено, а теперь компилируют в Visual C++ 10, и в нем предупреждение уже выключено, то такая конструкция смысла не имеет, а могла просто достаться в наследство.

Что особенно приятно, эти ситуации возникают в самый подходящий момент – при переходе с одной версии компилятора на другую, при попытке включить в проект кучу стороннего кода, который и без того не прост в использовании, вторая ситуация просто приводит к подавлению предупреждения, в результате можно пропустить ошибку в коде, которая позже поможет пользователям получить премию Дарвина.

На самом деле, предупреждения нужно глушить так:

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

Выглядит страшно, но чего не сделаешь, чтобы не пропустить ту самую ошибку на миллиард.

Часто бывает полезно указать, что предупреждение неприменимо. Это указывает членам команды, что код был проверен, и что предупреждение можно подавлять. в этой статье описываются различные способы отключения нарушений анализа кода с помощью интегрированной среды разработки Visual Studio.

Подавлять нарушения с помощью файла EditorConfig

В файле EditorConfig задайте уровень серьезности none , например dotnet_diagnostic.CA1822.severity = none . Сведения о добавлении файла EditorConfig см. в разделе Добавление файла EditorConfig в проект.

Подавлять нарушения в исходном коде

В редакторе кода

Поместите курсор в строку кода с нарушением и нажмите клавишу CTRL + (.) , чтобы открыть меню быстрые действия . Выберите ПОДАВЛЯТЬ какскскскс, а затем выберите в источнике или в источнике (атрибут).

При выборе в поле Источник вы увидите предварительную версию директивы препроцессора, которая будет добавлена в код.

Подавлять диагностику в меню быстрых действий

Подавлять диагностику в меню быстрых действий

При выборе в поле Источник (атрибут) отображается предварительный просмотр атрибута SuppressMessage , который будет добавлен в код.

Подавлять диагностику в меню быстрых действий с помощью атрибута

Из Список ошибок

Выберите правила, которые необходимо отключить, и щелкните правой кнопкой мыши и выберите подавлять > в источнике.

В диалоговом окне Просмотр изменений нажмите кнопку Применить.

Если в Обозреватель решений не отображается пункт подавить , то, скорее всего, это произошло из-за сборки, а не для интерактивного анализа. Список ошибок отображает диагностические или нарушения правил, как в реальном коде, так и в сборке. Так как диагностика сборки может быть устаревшей, например, если вы изменили код, чтобы устранить нарушение, но оно не было перестроено, вы не сможете отключить эти диагностические данные от Список ошибок. Диагностика из интерактивного анализа или IntelliSense всегда актуальны с текущими источниками и могут быть подавлены из Список ошибок. Чтобы исключить диагностику сборки из выбора, переключите фильтр источника Список ошибок с сборки + IntelliSense на IntelliSense. Затем выберите диагностику, которую необходимо отключить, и продолжайте, как описано выше.

Фильтр источника список ошибок в Visual Studio

Подавлять нарушения с помощью файла глобального подавления

На Список ошибок выберите правила, которые необходимо отключить, а затем щелкните правой кнопкой мыши и выберите пункт подавлять > в файле подавления. Откроется диалоговое окно Просмотр изменений , в котором будет показан предварительный просмотр SuppressMessageAttribute атрибута, добавляемого в глобальный файл подавления.

Предварительный просмотр добавления атрибута SuppressMessage в файл подавления

В редакторе кода поместите курсор в строку кода с нарушением и нажмите клавиши быстрого действия и рефакторинга (или нажмите клавишу CTRL + period (. )), чтобы открыть меню быстрые действия . Выберите ПОДАВЛЯТЬ какскскскс, а затем выберите в файле подавления. Вы увидите предварительную версию файла глобального подавления , который будет создан или изменен.

  • В меню анализ выберите пункт анализировать > сборку и подавлять активные проблемы в строке меню, чтобы отключить все текущие нарушения. Иногда это называется "задания базовых показателей".
  • в меню анализ выберите анализировать > выполнение Code Analysis и подавлять активные проблемы в строке меню, чтобы отключить все текущие нарушения. Иногда это называется "задания базовых показателей".

Подавлять нарушения с помощью параметров проекта

Подавлять нарушения с помощью набора правил

В редакторе набора правил снимите флажок рядом с его именем или действием задать значение нет.

Подавление в исходном код и атрибут SuppressMessage

Подавление в исходном код (ISS) использует SuppressMessageAttribute атрибут для подавления предупреждения. Атрибут можно поместить ближе к сегменту кода, вызвавшему предупреждение. Можно добавить SuppressMessageAttribute атрибут в исходный файл, введя его в, или можно использовать контекстное меню предупреждения в Список ошибок , чтобы добавить его автоматически.

SuppressMessageAttributeАтрибут является условным атрибутом, включенным в метаданные Il сборки управляемого кода, только если символ компиляции CODE_ANALYSIS определен во время компиляции.

Не следует использовать подавления в исходном виде в сборках выпуска, чтобы предотвратить случайное пересылку метаданных подавления в исходном источнике. Кроме того, из-за затрат на обработку подавления в исходном коде производительность приложения может снизиться.

если вы переносите проект на Visual Studio 2017, то, возможно, внезапно посталкивается с большим количеством предупреждений анализа кода. если вы не готовы устранить предупреждения, их можно отключить, выбрав пункт анализ > выполнения Code Analysis и подавлять активные проблемы.

Выполнение анализа кода и отключение проблем в Visual Studio

если вы переносите проект на Visual Studio 2019, то, возможно, внезапно посталкивается с большим количеством предупреждений анализа кода. Если вы не готовы устранить предупреждения, их можно отключить, выбрав пункт анализировать > сборку и подавлять активные проблемы.

SuppressMessage - атрибут

При выборе параметра подавлять в контекстном меню или щелчке правой кнопкой мыши предупреждения анализа кода в Список ошибок SuppressMessageAttribute атрибут добавляется либо в код, либо в глобальный файл подавления проекта.

SuppressMessageAttributeАтрибут имеет следующий формат:

К свойствам атрибута относятся:

Category — Категория, в которой определено правило. Дополнительные сведения о категориях правил анализа кода см. в разделе предупреждения управляемого кода.

CheckId — идентификатор правила. Поддержка включает короткое и длинное имя для идентификатора правила. Короткое имя — КАКСКСКСКС; длинное имя — КАКСКСКСКС: Фриендлитипенаме.

Scope — целевой объект, в котором предупреждение подавляется. Если целевой объект не указан, ему присваивается значение целевого объекта атрибута. В число поддерживаемых областей входят следующие.

module — Эта область подавляет предупреждения для сборки. Это глобальное подавление, которое применяется ко всему проекту.

type — Эта область подавляет предупреждения для типа.

member — Эта область подавляет предупреждения для элемента.

namespace — Эта область подавляет предупреждения относительно пространства имен. Он не отключает предупреждения для типов в пространстве имен.

namespaceanddescendants -(требуется компилятор версии 3. x или выше и Visual Studio 2019). эта область подавляет предупреждения в пространстве имен и всех его дочерних символах. namespaceanddescendants Значение игнорируется устаревшим анализом.

Target — идентификатор, который используется для указания целевого объекта, в котором предупреждение подавляется. Он должен содержать полное имя элемента.

при появлении предупреждений в Visual Studio можно просмотреть примеры SuppressMessage , добавив подавление в глобальный файл подавления. Атрибут подавления и его обязательные свойства отображаются в окне предварительного просмотра.

Использование SuppressMessage

Code Analysis предупреждения подавляются на уровне, к которому SuppressMessageAttribute применяется атрибут. Например, атрибут можно применить на уровне сборки, модуля, типа, члена или параметра. Целью этого является тесное связывание информации о подавлении с кодом, в котором происходит нарушение.

Общая форма подавления включает категорию правила и идентификатор правила, который содержит необязательное удобное для восприятия представление имени правила. Пример:

При наличии достаточной производительности для минимизации метаданных подавления в исходном виде имя правила можно опустить. Категория правила и идентификатор его правила вместе составляют достаточно уникальный идентификатор правила. Пример:

В целях удобства обслуживания не рекомендуется указывать имя правила.

Подавлять выборочные нарушения внутри тела метода

К методу могут применяться атрибуты подавления, но они не могут быть внедрены в тело метода. Это означает, что все нарушения конкретного правила подавляются при добавлении SuppressMessageAttribute атрибута в метод.

Чтобы отключить определенное нарушение правила, укажите имя символа для MessageId свойства SuppressMessageAttribute атрибута. В следующем примере показан код с двумя нарушениями CA1500: вариабленамесшаулднотматчфиелднамес — один для name переменной и другой для age переменной. Подавляется только нарушение для age символа.

Подавления на глобальном уровне

[module: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "MyNamespace")]

При подавлении предупреждения с namespace областью предупреждение подавляется по самому пространству имен. Предупреждение не подавляется по типам в пространстве имен.

Все подавления можно выразить, указав явную область. Эти подавления должны находиться на глобальном уровне. Подавление на уровне члена нельзя указать путем оформления типа.

[module: SuppressMessage("Microsoft.Design", "CA1055:AbstractTypesDoNotHavePublicConstructors", Scope="member", Target="Microsoft.Tools.FxCop.Type..ctor()")]

Target всегда содержит полное имя элемента.

Файл глобального подавления

Область подавления модуля

Нарушения качества кода для всей сборки можно отключить с помощью области модуля .

Созданный код

Компиляторы управляемого кода и некоторые сторонние средства создают код для упрощения разработки кода. Созданный компилятором код, который отображается в исходных файлах, обычно отмечается GeneratedCodeAttribute атрибутом.

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

Анализ кода игнорируется GeneratedCodeAttribute при применении к целой сборке или одному параметру.


Я точно знаю что код рабочий;
Подчеркиваний нет, писал с видео урока, версии visual studio и visual С++ идентичны, cто раз перепроверил;

а где ошибки-то?
кроме _geth() нивижу ничего плохого. Но под виндой это почти норма.

"не обращая внимания на ошибки" скомпилить нельзя. Если будет error - исполняемый файл не создатся. warning'и не влияют на результат.

если вопрос про то, как запустить компиляцию, то мои пальцы помнят нажатие на F9

Рыжая Морда Просветленный (36468) в правой версии всё есть. я тут глаза сломаю, если буду точки высматривать. пусть автор лучше пояснит, в чём проблема.

Ничего вы не знаете, код не рабочий.

строчка 27 и срочка 30 - не хватает ";"
Компилятор на это и ругаеться.
Учитесь читать логи ошибок.

И да. 10-12 не нужно было описывать, можно описать using namespace std; линковщик не тупой, все пространство имен не будет подключать.
16 - лишнее, вы выводите английские тексты на экран. А при вводе русского - у вас будет билиберда выводиться - изза этой функции.
31 - тоже лишнее - это консольное приложение. запускать его нужно ИЗ КОНСОЛИ.

П. С. Вообще не понимаю вашей логики - компилятор - это не человек.
Это не ребенок который сказал - Не буду есть брокколи, т. к. оно не вкусное - А вы ему будете специально запихивать в рот его.
Если компилятор сказал - Не буду это компилировать, т. к. ошибки, - Вы его не заставите.

> можно описать using namespace std; линковщик не тупой, все пространство имен не будет подключать.

При чём тут вообще линковщик? using namespace X; именно что требует (по стандарту), чтобы все символы из пространства имён X были доступны в текущем пространстве имён.

victor chelak Мыслитель (8368) Вы правы. Не причем. Просто есть люди, считающие (с какого-то перепугу) что: using std::cout; using std::cin; using std::endl; -Будет оптимальннее нежели using namespace std; Хотя по сути, это ничего не меняет.

через cout выведеться и str1 и str2 точно так же еслиб это были не массивы символов - а string .
Ошибка у него в пропущенных ";"

Вот это -
cout<< "Str2: \"" <<str2 <<"\"\n\n" _getch();
Как и вот это
cout<< "Str2: \"" <<str2 <<"\"\n\n" strcpy(str2,str1);
Не скомпилиться. А так не считая того что тут минимум 2 ненужные команды и подключсение лишней библиотеки изза этого - код будет работать корректно

Читайте также:

[module name="footer"]