Видаліть захищені попередження (_CRT_SECURE_NO_WARNINGS) з проектів за замовчуванням у Visual Studio


196

Чи є спосіб встановити за замовчуванням для всіх проектів видалення захисних попереджень прекомпілятора, які виникають при використанні таких функцій, як scanf (). Я виявив, що ви можете це зробити, додавши рядок у варіанті проекту або a #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
Martijn van Wezel

3
@MartijnvanWezel 1 наприкінці не потрібно.
qqqqq

1
@qqqqq Це змусить бути правдою
Martijn van Wezel

Відповіді:


286

Позначте всі бажані проекти в провіднику рішень.

Натисніть Alt-F7 або клацніть правою кнопкою миші в провіднику рішень та виберіть "Властивості"

Конфігурації: Усі конфігурації

Клацніть на рядку «Визначення препроцесора», щоб викликати його редактора

Виберіть Редагувати ...

Скопіюйте "_CRT_SECURE_NO_WARNINGS" у біле поле "Визначення препроцесора" вгорі.

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


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

Виправлено станом на 13 січня 2015 р.

Це лише описує перший крок. Після того, як ви налаштували все так, як вам потрібно, вам також потрібно експортувати шаблон проекту (див. Як: Створити шаблони проектів для інструкцій).
Неочікуваний

92

Можливо, це було тому, що я все ще новачок у VS і, безумовно, новачок у С, але єдине, що дозволило мені створити - додавання

#pragma warning(disable:4996)

У верхній частині мого файлу це придушило помилку C4996, яку я отримував із sprintf

Трохи дратує, але ідеально підходить для мого крихітного коду і, безумовно, найпростіший.

Я читав про це тут: https://msdn.microsoft.com/en-us/library/2c8f766e.aspx


5
Я намагався будь-який варіант #define, показаний на цій сторінці (з та без 1 на кінці), і для мене працювала тільки #pragma. (Видання для спільноти VS2013) Я впевнений, що мені щось не вистачає, але в якийсь момент вам просто потрібно, щоб він працював, щоб ви могли продовжувати роботу.
Spike0xff

Було точно те саме - він відчуває себе ніжно, але наприкінці дня, добре, це працює, @ Spike0xff
Shaun314

2
Я можу підтвердити, що _CRT_SECURE_NO_WARNINGS не працює в VC ++ 2015, але вище працює. Дякую!
Shital Shah

@ShitalShah Ваше підтвердження базується на особистих експериментах чи офіційній документації Microsoft?
qqqqq

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

29

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

  1. Відкрийте менеджер ресурсів (Перегляд-> Менеджер ресурсів)
  2. У диспетчері ресурсів клацніть правою кнопкою миші проект і виберіть "Додати новий лист властивостей проекту"
  3. Дайте йому ім’я та створіть його у загальному каталозі. Аркуш властивостей буде додано до всіх цілей побудови.
  4. Клацніть правою кнопкою миші на новому аркуші властивостей і виберіть "Властивості". Це відкриє властивості та дозволить змінити налаштування так само, як ви хотіли б, якщо ви редагували їх для проекту.
  5. Перейдіть до "Загальні властивості-> C / C ++ -> Препроцесор"
  6. Відредагуйте налаштування "Визначення препроцесора" та додайте _CRT_SECURE_NO_WARNINGS.
  7. Збережіть і закінчите.

Тепер, коли ви створюєте новий проект, додайте цей аркуш власності так ...

  1. Відкрийте менеджер ресурсів (Перегляд-> Менеджер ресурсів)
  2. У диспетчері ресурсів клацніть правою кнопкою миші проект і виберіть "Додати існуючий аркуш власності проекту"

Перевага тут полягає в тому, що ви не тільки отримуєте єдине місце для керування загальними налаштуваннями, але в будь-який час, коли ви змінюєте налаштування, вони розповсюджуються на ВСІ проекти, які ним користуються. Це зручно, якщо у вас є багато таких налаштувань, як _CRT_SECURE_NO_WARNINGSбібліотеки, наприклад Boost, які ви хочете використовувати у своїх проектах.


Це круто. Я не можу повірити, що я ніколи не відкривав менеджера з власності до сьогодні.
Джеймс Джонстон

20

Усі рішення тут не спрацювали на моєму VS2013, однак я розмістив #define _CRT_SECURE_NO_WARNINGSцей файл у stdafx.h безпосередньо перед тим, як #pragma onceі всі попередження були придушені. Примітка. Я кодую тільки для цілей прототипування, щоб підтримати моє дослідження, тому, будь ласка, переконайтеся, що ви розумієте наслідки цього методу під час написання свого коду.

Сподіваюся, це допомагає


1
Де stdafx.hзнаходиться?
Щось щось щось

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 ..) Звичайно, я вважаю за краще а).

Я можу підтвердити, що: #define _CRT_SECURE_NO_WARNINGS (без значення) НЕ ПРАЦЮЄ.

PS реальна суть полягає в тому, щоб поставити ці параметри ПЕРЕД оголошенням функцій, тобто перед * .h


Працює і у Visual Studio 2010.
ebyrob

8

просто скопіюйте " _CRT_SECURE_NO_WARNINGS " вставте його на проекти- > властивості-> c / c ++ -> препроцесор-> визначення препроцесора, натисніть ok.it буде працювати


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

Це неправильно. Порядок не має значення. Зовсім. Я припускаю, що ви ніколи не пояснювали, чому це було потрібно, тому що немає причини.
Неочікуваний

Це не питання "порядку", лише двічі перевіряйте: якщо ви #define _CRT_SECURE_NO_WARNINGS розмістите після #pragma один раз, ви все одно отримаєте цю помилку!
Майкл Хефраті

Поведінка програми #pragma onceвизначається реалізацією, але вона відповідає загальноприйнятому фактичному стандарту у Visual Studio. Якщо для вас це має значення, незалежно від того, ви визначили символ препроцесора перед прагмою чи після неї, ви маєте порушену конфігурацію проекту (це припускаючи, що ви - надмірно - прирівнюєте "попередньо складені заголовки" та "stdafx.h" " ).
Неочікуваний

У чому навіть значення "зламаної конфігурації проекту"? Я створив новий проект Win32 і протестував обидва сценарії.
Майкл Хефраті

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