Удалите безопасные предупреждения (_CRT_SECURE_NO_WARNINGS) из проектов по умолчанию в Visual Studio


196

Есть ли способ установить по умолчанию для всех проектов удаление предупреждений прекомпилятора о безопасности, которые появляются при использовании таких функций, как scanf (). Я обнаружил, что вы можете сделать это, добавив строку в опцию проекта или #define _CRT_SECURE_NO_WARNINGSв начале кода.

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

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

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


2
Вы можете экспортировать шаблон проекта с определенным _CRT_SECURE_NO_WARNINGS.
BlueWanderer

Это похоже на хороший обходной путь. Я смотрю на это. Спасибо!
Хуан Мартинес

3
вы забыли 1 на конце #define _CRT_SECURE_NO_WARNINGS 1
Мартин ван Везел

3
@MartijnvanWezel 1 в конце не требуется.
qqqqq

1
@qqqqq Это заставит быть правдой
Мартейн ван

Ответы:


286

Отметьте все нужные проекты в обозревателе решений.

Нажмите Alt-F7 или щелкните правой кнопкой мыши в обозревателе решений и выберите «Свойства»

Конфигурации: все конфигурации

Нажмите на строку «Определения препроцессора», чтобы вызвать его редактор.

Выберите Изменить ...

Скопируйте «_CRT_SECURE_NO_WARNINGS» в белое поле «Определения препроцессора» вверху.

введите описание изображения здесь


10
Здесь описывается, как добавить его для одного проекта, который, я думаю, ОП уже знает (хотя это не ясно на 100%). Ключевой вопрос - как добавить его, чтобы он появлялся во всех проектах. В идеале, как можно добавить его в макрос% (PreprocessorDefinitions), чтобы он включался везде?
Роб Гиллиам

Исправлено по состоянию на 13 января 2015 г.

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

93

Возможно, это потому, что я все еще новичок в VS и определенно новичок в C, но единственное, что позволило мне собрать, было добавление

#pragma warning(disable:4996)

Вверху моего файла это подавило ошибку C4996, которую я получал с помощью sprintf

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

Я читал об этом здесь: https://msdn.microsoft.com/en-us/library/2c8f766e.aspx


5
Я попробовал все варианты #define, показанные на этой странице (с 1 и без на конце), и у меня работала только #pragma. (VS2013 Community Edition) Я уверен, что что-то упустил, но в какой-то момент вам просто нужно, чтобы это работало, чтобы вы могли покончить с этим.
Spike0xff

Было то же самое - он чувствует себя дерьмово, но в конце дня, черт
возьми

2
Я могу подтвердить, что _CRT_SECURE_NO_WARNINGS не работает в VC ++ 2015, но выше работает. Спасибо!
Шиталь Шах

@ShitalShah Ваше подтверждение основано на личных экспериментах или какой-либо официальной документации Microsoft?
qqqqq

1
@bri: безусловно, установка по умолчанию может иметь нежелательные эффекты. Вы действительно хотели восстановить поведение до того, что было раньше. Для этого используйте #pragma warning(push)/#pragma warning(pop) вместо.
IInspectable

29

Не автоматически, нет. Вы можете создать шаблон проекта в соответствии с предложением BlueWandered или создать собственный лист свойств, который можно использовать для текущих и всех будущих проектов.

  1. Откройте Менеджер свойств (View-> Property Manager)
  2. В диспетчере свойств щелкните правой кнопкой мыши свой проект и выберите «Добавить лист свойств нового проекта».
  3. Дайте ему имя и создайте его в общем каталоге. Лист свойств будет добавлен ко всем целям сборки.
  4. Щелкните правой кнопкой мыши новый лист свойств и выберите «Свойства». Это откроет свойства и позволит вам изменить настройки так же, как если бы вы редактировали их для проекта.
  5. Перейдите в «Общие свойства-> C / C ++ -> Препроцессор»
  6. Отредактируйте настройку «Определения препроцессора» и добавьте _CRT_SECURE_NO_WARNINGS.
  7. Сохранить и все готово.

Теперь каждый раз, когда вы создаете новый проект, добавьте этот список свойств примерно так ...

  1. Откройте Менеджер свойств (View-> Property Manager)
  2. В диспетчере свойств щелкните правой кнопкой мыши свой проект и выберите «Добавить существующий список свойств проекта».

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


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

20

Все приведенные здесь решения не сработали на моем VS2013, однако я поместил #define _CRT_SECURE_NO_WARNINGSфайл stdafx.h как раз перед тем, как #pragma onceвсе предупреждения были подавлены. Примечание: я пишу код только для целей создания прототипов, чтобы поддержать мои исследования, поэтому, пожалуйста, убедитесь, что вы понимаете значение этого метода при написании своего кода.

Надеюсь это поможет


1
Где stdafx.hнаходится?
SomethingSomething

1
Для тех, кто не знает, это должно быть определено как 1, например: #define _CRT_SECURE_NO_WARNINGS 1
kirk.burleson

11

мои два цента за VS 2017:

Я могу подтвердить, что он работает в stdafx.h в обоих стилях:

а)

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1 
#define _WINSOCK_DEPRECATED_NO_WARNINGS 1 

б)

#define _CRT_SECURE_NO_WARNINGS 1 
#define _WINSOCK_DEPRECATED_NO_WARNINGS 1 
#pragma once

(Я добавил другое определение для сетевых вызовов MSDN ..) Конечно, я предпочитаю a).

Я могу подтвердить, что: #define _CRT_SECURE_NO_WARNINGS (без значения) НЕ РАБОТАЕТ.

PS реальная цель состоит в том, чтобы поместить эти определения ДО объявления функций, то есть до * .h


Работает и в Visual Studio 2010.
ebyrob

8

просто скопируйте " _CRT_SECURE_NO_WARNINGS " и вставьте его в проекты- > свойства-> c / c ++ -> препроцессор-> определения препроцессора, нажмите ОК. Это будет работать


0

Если ваш проект не использует stdafx.h, вы можете поместить следующие строки в качестве первых строк в вашем файле .cpp, и предупреждение компилятора должно исчезнуть - по крайней мере, для меня это было в Visual Studio C ++ 2008.

#ifdef _CRT_SECURE_NO_WARNINGS
#undef _CRT_SECURE_NO_WARNINGS
#endif
#define _CRT_SECURE_NO_WARNINGS 1

Вполне нормально иметь комментарий и пустые строки перед ними.


0

Даже если вы можете добавить _CRT_SECURE_NO_WARNINGS в свойства вашего проекта, самый простой способ - использовать stdafx.h для любых предупреждений и ошибок, просто убедитесь, что вы поместили следующую строку (и аналогичную) ДО

#pragma once

Также нет необходимости определять значение (то есть «1») для _CRT_SECURE_NO_WARNINGS, пока оно определено. Так должно выглядеть так:

#define _CRT_SECURE_NO_WARNINGS 

#pragma once

Это неверно Заказ не имеет значения. Вообще. Я предполагаю, что вы никогда не объясняли, почему это было необходимо, потому что нет причин.
IInspectable

Это не вопрос "порядка", просто дважды проверьте: если вы поместите #define _CRT_SECURE_NO_WARNINGS после #pragma один раз, вы все равно получите эту ошибку!
Майкл Хефрати

Поведение #pragma onceопределяется реализацией, но соответствует общему стандарту де-факто в Visual Studio. Если это имеет значение для вас, независимо от того, определили ли вы символ препроцессора перед прагмой или после него, то у вас неправильная конфигурация проекта (это предполагает, что вы - излишне - приравниваете «скомпилированные заголовки» и «stdafx.h»). " )
IInspectable

Что даже означает «сломанная конфигурация проекта»? Я создал новый проект Win32 и протестировал оба сценария.
Майкл Хефрати

Пожалуйста, ознакомьтесь с официальной документацией, чтобы узнать об истинных требованиях к использованию этого символа препроцессора.
IInspectable
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.