Domyślnie usuwaj bezpieczne ostrzeżenia (_CRT_SECURE_NO_WARNINGS) z projektów w Visual Studio

195

Czy istnieje sposób, aby ustawić domyślnie dla wszystkich projektów usuwanie bezpiecznych ostrzeżeń prekompilatora, które pojawiają się podczas korzystania z funkcji takich jak scanf (). Odkryłem, że możesz to zrobić, dodając wiersz w opcji projektu lub #define _CRT_SECURE_NO_WARNINGSna początku kodu.

Ciągle tworzę nowe projekty do rozwiązywania konkursów programistycznych, a dodawanie:

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

Na początku kodu lub aby ustawić go w opcjach prekompilatora za każdym razem, gdy rozpoczynam nowy projekt.

Juan Martinez
źródło
2
Możesz wyeksportować szablon projektu ze zdefiniowanym _CRT_SECURE_NO_WARNINGS.
BlueWanderer
To wydaje się dobrym obejściem. Patrzę na to. Dzięki!
Juan Martinez
3
zapominasz 1 na końcu # zdefiniować _CRT_SECURE_NO_WARNINGS 1
Martijn van Wezel
3
@MartijnvanWezel 1 na końcu nie jest wymagany.
qqqqq,
1
@qqqqq Wymusi to prawdę
Martijn van Wezel,

Odpowiedzi:

286

Zaznacz wszystkie pożądane projekty w eksploratorze rozwiązań.

Naciśnij klawisze Alt-F7 lub kliknij prawym przyciskiem myszy w eksploratorze rozwiązań i wybierz „Właściwości”

Konfiguracje: wszystkie konfiguracje

Kliknij wiersz Definicje preprocesora, aby wywołać jego edytor

Wybierz Edytuj ...

Skopiuj „_CRT_SECURE_NO_WARNINGS” do białego pola Definicje preprocesora u góry.

wprowadź opis zdjęcia tutaj

użytkownik2548100
źródło
10
Opisuje, jak dodać go do jednego projektu, o którym myślę, że PO już wie (chociaż nie jest to w 100% jasne). Kluczowym pytaniem jest, jak go dodać, aby pojawiał się we wszystkich projektach. Idealnie, w jaki sposób można dodać go do makra% (PreprocessorDefinitions), aby można go było uwzględnić wszędzie?
Rob Gilliam
Naprawiono na 13 stycznia 2015 r.
To opisuje tylko pierwszy krok. Po skonfigurowaniu wszystkiego tak, jak jest to potrzebne, należy również wyeksportować szablon projektu ( instrukcje : Tworzenie szablonów projektu ).
Widoczny
92

Być może dlatego, że wciąż jestem nowy w VS i zdecydowanie nowy w C, ale jedyną rzeczą, która pozwoliła mi zbudować, było dodanie

#pragma warning(disable:4996)

W górnej części mojego pliku pomijało to błąd C4996, który otrzymywałem za pomocą sprintf

Trochę denerwujące, ale idealne dla mojego małego kodu i zdecydowanie najłatwiejsze.

Przeczytałem o tym tutaj: https://msdn.microsoft.com/en-us/library/2c8f766e.aspx

Shaun314
źródło
5
Próbowałem każdej odmiany #define pokazanej na tej stronie (z i bez 1 na końcu) i tylko #pragma działała dla mnie. (Wersja społecznościowa VS2013) Jestem pewien, że coś mi umknęło, ale w pewnym momencie potrzebujesz go po prostu do pracy, abyś mógł z tym zacząć.
Spike0xff,
Miał dokładnie to samo - czuje się gówno, ale pod koniec dnia, kurwa, działa @ Spike0xff
Shaun314
2
Mogę potwierdzić, że _CRT_SECURE_NO_WARNINGS nie działa w VC ++ 2015, ale działa wyżej. Dzięki!
Shital Shah,
@ShitalShah Czy Twoje potwierdzenie opiera się na osobistych eksperymentach lub oficjalnej dokumentacji Microsoft?
qqqqq,
1
@bri: Bezwarunkowe ustawienie wartości domyślnej może mieć niepożądane efekty. Naprawdę chciałeś przywrócić zachowanie do poprzedniego stanu. Aby to zrobić, użyj #pragma warning(push)/#pragma warning(pop) zamiast.
Widoczny
29

Nie automatycznie, nie. Możesz utworzyć szablon projektu zgodnie z sugestią BlueWandered lub utworzyć niestandardowy arkusz właściwości, którego będziesz mógł używać w bieżących i wszystkich przyszłych projektach.

  1. Otwórz Menedżera nieruchomości (Widok-> Menedżer nieruchomości)
  2. W Menedżerze właściwości kliknij prawym przyciskiem myszy swój projekt i wybierz „Dodaj nowy arkusz właściwości projektu”
  3. Nadaj mu nazwę i utwórz go we wspólnym katalogu. Arkusz właściwości zostanie dodany do wszystkich celów kompilacji.
  4. Kliknij prawym przyciskiem myszy nowy arkusz właściwości i wybierz „Właściwości”. Spowoduje to otwarcie właściwości i umożliwi zmianę ustawień tak, jak w przypadku edytowania ich dla projektu.
  5. Przejdź do „Wspólnych właściwości-> C / C ++ -> Preprocesor”
  6. Edytuj ustawienie „Definicje preprocesora” i dodaj _CRT_SECURE_NO_WARNINGS.
  7. Zapisz i gotowe.

Teraz za każdym razem, gdy tworzysz nowy projekt, dodaj ten arkusz właściwości w ten sposób ...

  1. Otwórz Menedżera nieruchomości (Widok-> Menedżer nieruchomości)
  2. W Menedżerze właściwości kliknij prawym przyciskiem myszy swój projekt i wybierz „Dodaj istniejący arkusz właściwości projektu”

Korzyścią jest to, że nie tylko masz jedno miejsce do zarządzania wspólnymi ustawieniami, ale za każdym razem, gdy zmieniasz ustawienia, są one propagowane do WSZYSTKICH projektów, które z nich korzystają. Jest to przydatne, jeśli masz wiele ustawień _CRT_SECURE_NO_WARNINGSlub bibliotek takich jak Boost, których chcesz używać w swoich projektach.

Kapitan Obvlious
źródło
To cudownie. Nie mogę uwierzyć, że nigdy dotąd nie odkryłem Zarządzającego Nieruchomościami.
James Johnston,
20

Wszystkie rozwiązania tutaj nie działały na moim VS2013, jednak wstawiłem plik stdafx.h #define _CRT_SECURE_NO_WARNINGStuż przed #pragma oncei wszystkie ostrzeżenia zostały zniesione. Uwaga: koduję tylko w celach prototypowych w celu wsparcia moich badań, więc upewnij się, że rozumiesz implikacje tej metody podczas pisania kodu.

Mam nadzieję że to pomoże

PDF417
źródło
1
Gdzie się stdafx.hznajduje?
SomethingSomething
1
Dla tych, którzy nie wiedzą, należy go zdefiniować jako 1, jak to: # zdefiniować _CRT_SECURE_NO_WARNINGS 1
kirk.burleson
11

moje dwa centy za VS 2017:

Mogę potwierdzić, że działa w stdafx.h oba w tych stylach:

za)

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1 
#define _WINSOCK_DEPRECATED_NO_WARNINGS 1 

b)

#define _CRT_SECURE_NO_WARNINGS 1 
#define _WINSOCK_DEPRECATED_NO_WARNINGS 1 
#pragma once

(Dodałem kolejną definicję dla połączeń sieciowych MSDN ..) Oczywiście wolę a).

Mogę potwierdzić, że: # zdefiniować _CRT_SECURE_NO_WARNINGS (bez wartości) NIE DZIAŁA.

PS prawdziwym celem jest umieszczenie tych definicji PRZED deklaracjami funkcji, tj. Przed * .h

ingconti
źródło
Działa również w Visual Studio 2010.
ebyrob,
8

po prostu skopiuj „ _CRT_SECURE_NO_WARNINGS ” wklej go na projekty-> właściwości-> c / c ++ -> preprocesor-> definicje preprocesora kliknij ok. to zadziała

Leninkumar
źródło
0

Jeśli twój projekt nie używa pliku stdafx.h, możesz umieścić następujące wiersze jako pierwsze wiersze w pliku .cpp, a ostrzeżenie kompilatora powinno zniknąć - przynajmniej w przypadku Visual Studio C ++ 2008.

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

Można mieć komentarz i puste wiersze przed nimi.

R Sahu
źródło
0

Nawet jeśli możesz dodać _CRT_SECURE_NO_WARNINGS do właściwości projektu, najłatwiejszym sposobem jest użycie pliku stdafx.h do wszelkiego rodzaju ostrzeżeń i wyłączania błędów, po prostu upewnij się, że umieściłeś następujący wiersz (i podobne) PRZED

#pragma once

Nie ma również potrzeby definiowania wartości (tj. „1”) dla _CRT_SECURE_NO_WARNINGS, o ile jest ona zdefiniowana. Powinno więc wyglądać tak:

#define _CRT_SECURE_NO_WARNINGS 

#pragma once
Michael Haephrati
źródło
To jest niepoprawne. Kolejność nie robi różnicy. W ogóle. Zakładam, że nigdy nie wyjaśniłeś, dlaczego było to konieczne, ponieważ nie ma powodu.
Widoczny
To nie jest kwestia „zamówienia”, po prostu podwójnie zaznaczone: jeśli raz umieścisz #define _CRT_SECURE_NO_WARNINGS po #pragma, nadal pojawi się ten błąd!
Michael Haephrati
Zachowanie #pragma oncejest zdefiniowane w ramach implementacji, ale jest zgodne z powszechnym de facto standardem w Visual Studio. Jeśli ma to dla ciebie znaczenie, niezależnie od tego, czy zdefiniowałeś symbol preprocesora przed pragmą, czy po nim, oznacza to, że masz zepsutą konfigurację projektu (zakłada to, że nadmiernie utożsamiasz „prekompilowane nagłówki” i „stdafx.h” „ ).
Widoczny
Jakie jest nawet znaczenie „zepsutej konfiguracji projektu”? Utworzyłem nowy projekt Win32 i przetestowałem oba scenariusze.
Michael Haephrati
Zapoznaj się z oficjalną dokumentacją, aby dowiedzieć się o prawdziwych wymaganiach dotyczących używania tego symbolu preprocesora.
Widoczny