Entfernen Sie sichere Warnungen (_CRT_SECURE_NO_WARNINGS) standardmäßig aus Projekten in Visual Studio


195

Gibt es eine Möglichkeit, standardmäßig für alle Projekte die Sicherheitswarnungen des Precompilers zu entfernen, die bei Verwendung von Funktionen wie scanf () angezeigt werden? Ich habe festgestellt, dass Sie dies tun können, indem Sie eine Zeile in der Projektoption oder eine #define _CRT_SECURE_NO_WARNINGSam Anfang des Codes hinzufügen .

Ich finde mich immer wieder dabei, neue Projekte zum Lösen von Programmierwettbewerben zu erstellen, und es ist wirklich ärgerlich (und braucht wertvolle Zeit), Folgendes hinzuzufügen:

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

Am Anfang des Codes oder um ihn bei jedem Start eines neuen Projekts in den Precompiler-Optionen festzulegen.


2
Sie können eine Projektvorlage exportieren, wobei _CRT_SECURE_NO_WARNINGS definiert ist.
BlueWanderer

Das scheint eine gute Lösung zu sein. Ich schaue hinein. Vielen Dank!
Juan Martinez

3
Sie vergessen die 1 am Ende #define _CRT_SECURE_NO_WARNINGS 1
Martijn van Wezel

3
@MartijnvanWezel 1 am Ende ist nicht erforderlich.
qqqqq

1
@qqqqq Es wird zwingen, wahr zu sein
Martijn van Wezel

Antworten:


286

Markieren Sie alle gewünschten Projekte im Solution Explorer.

Drücken Sie Alt-F7 oder klicken Sie mit der rechten Maustaste in den Lösungs-Explorer und wählen Sie "Eigenschaften".

Konfigurationen: Alle Konfigurationen

Klicken Sie auf die Zeile Präprozessordefinitionen, um den Editor aufzurufen

Wählen Sie Bearbeiten ...

Kopieren Sie "_CRT_SECURE_NO_WARNINGS" in das weiße Feld "Präprozessordefinitionen" oben.

Geben Sie hier die Bildbeschreibung ein


10
Dies beschreibt, wie man es für ein Projekt hinzufügt, das das OP meiner Meinung nach bereits kennt (obwohl es nicht 100% klar ist). Die Schlüsselfrage ist, wie es hinzugefügt werden soll, damit es in allen Projekten angezeigt wird. Wie kann man es im Idealfall zum Makro% (PreprocessorDefinitions) hinzufügen, damit es überall enthalten ist?
Rob Gilliam


Dies beschreibt nur den ersten Schritt. Nachdem Sie alles so konfiguriert haben, wie Sie es benötigen, möchten Sie auch eine Projektvorlage exportieren ( Anweisungen finden Sie unter Gewusst wie: Erstellen von Projektvorlagen ).
Unsichtbar

91

Es mag sein, dass ich noch neu in VS und definitiv neu in C bin, aber das einzige, was ich bauen konnte, war das Hinzufügen

#pragma warning(disable:4996)

Am Anfang meiner Datei wurde dadurch der C4996-Fehler unterdrückt, den ich mit sprintf erhalten habe

Ein bisschen nervig, aber perfekt für mein kleines Stück Code und bei weitem am einfachsten.

Ich habe hier darüber gelesen: https://msdn.microsoft.com/en-us/library/2c8f766e.aspx


5
Ich habe jede auf dieser Seite gezeigte Variante von #define ausprobiert (mit und ohne die 1 am Ende) und nur das #pragma hat für mich funktioniert. (VS2013 Community Edition) Ich bin mir sicher, dass mir etwas fehlt, aber irgendwann muss es nur noch funktionieren, damit Sie weitermachen können.
Spike0xff

Hatte genau das gleiche - es fühlt sich beschissen an, aber am Ende des Tages funktioniert es @ Spike0xff
Shaun314

2
Ich kann bestätigen, dass _CRT_SECURE_NO_WARNINGS in VC ++ 2015 nicht funktioniert, aber oben funktioniert. Vielen Dank!
Shital Shah

@ShitalShah Basiert Ihre Bestätigung auf persönlichen Experimenten oder einer offiziellen Microsoft-Dokumentation?
qqqqq

1
@bri: Das bedingungslose Festlegen der Standardeinstellung kann unerwünschte Auswirkungen haben. Sie wollten das Verhalten wirklich so wiederherstellen, wie es vorher war. Verwenden Sie dazu #pragma warning(push)/#pragma warning(pop) .
Unsichtbar

29

Nicht automatisch, nein. Sie können eine Projektvorlage erstellen, wie von BlueWandered vorgeschlagen, oder ein benutzerdefiniertes Eigenschaftenblatt erstellen, das Sie für Ihre aktuellen und alle zukünftigen Projekte verwenden können.

  1. Öffnen Sie den Property Manager (Ansicht-> Property Manager)
  2. Klicken Sie im Property Manager mit der rechten Maustaste auf Ihr Projekt und wählen Sie "Neues Projekteigenschaftsblatt hinzufügen".
  3. Geben Sie ihm einen Namen und erstellen Sie ihn in einem gemeinsamen Verzeichnis. Das Eigenschaftenblatt wird allen Build-Zielen hinzugefügt.
  4. Klicken Sie mit der rechten Maustaste auf das neue Eigenschaftenblatt und wählen Sie "Eigenschaften". Dadurch werden die Eigenschaften geöffnet und Sie können die Einstellungen so ändern, als würden Sie sie für ein Projekt bearbeiten.
  5. Gehen Sie zu "Allgemeine Eigenschaften-> C / C ++ -> Präprozessor"
  6. Bearbeiten Sie die Einstellung "Präprozessordefinitionen" und fügen Sie hinzu _CRT_SECURE_NO_WARNINGS.
  7. Speichern und fertig.

Fügen Sie jetzt jedes Mal, wenn Sie ein neues Projekt erstellen, dieses Eigenschaftenblatt wie folgt hinzu ...

  1. Öffnen Sie den Property Manager (Ansicht-> Property Manager)
  2. Klicken Sie im Property Manager mit der rechten Maustaste auf Ihr Projekt und wählen Sie "Vorhandenes Projekteigenschaftsblatt hinzufügen".

Der Vorteil hierbei ist, dass Sie nicht nur einen einzigen Ort zum Verwalten allgemeiner Einstellungen erhalten, sondern diese bei jeder Änderung an ALLE Projekte weitergeben, die sie verwenden. Dies ist praktisch, wenn Sie viele Einstellungen wie _CRT_SECURE_NO_WARNINGSoder Bibliotheken wie Boost haben, die Sie in Ihren Projekten verwenden möchten.


Das ist großartig. Ich kann nicht glauben, dass ich den Property Manager bis heute nie entdeckt habe.
James Johnston

20

Alle Lösungen hier funktionierten auf meinem VS2013 nicht, aber ich habe die #define _CRT_SECURE_NO_WARNINGSin die stdafx.h eingefügt, kurz bevor die #pragma onceund alle Warnungen unterdrückt wurden. Hinweis: Ich codiere nur für Prototyping-Zwecke, um meine Forschung zu unterstützen. Stellen Sie daher sicher, dass Sie die Auswirkungen dieser Methode beim Schreiben Ihres Codes verstehen.

Hoffe das hilft


1
Wo befindet stdafx.hsich?
Etwas Etwas

1
Für diejenigen, die es nicht wissen, sollte es wie folgt definiert werden: #define _CRT_SECURE_NO_WARNINGS 1
kirk.burleson

11

meine zwei Cent für VS 2017:

Ich kann bestätigen, dass es in stdafx.h in beiden Stilen funktioniert:

ein)

#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

(Ich habe eine weitere Definition für MSDN-Netzwerkanrufe hinzugefügt.) Natürlich bevorzuge ich a).

Ich kann Folgendes bestätigen: #define _CRT_SECURE_NO_WARNINGS (ohne Wert) FUNKTIONIERT NICHT .

PS Der eigentliche Punkt ist, diese Definitionen VOR Funktionsdeklarationen zu setzen, dh vor * .h


Funktioniert auch in Visual Studio 2010.
Ebyrob

8

Kopieren Sie einfach " _CRT_SECURE_NO_WARNINGS " und fügen Sie es in Projekte-> Eigenschaften-> c / c ++ -> Präprozessor-> Präprozessordefinitionen ein. Klicken Sie auf OK. Es wird funktionieren


0

Wenn Ihr Projekt stdafx.h nicht verwendet, können Sie die folgenden Zeilen als erste Zeilen in Ihre CPP-Datei einfügen, und die Compiler-Warnung sollte verschwinden - zumindest für mich in Visual Studio C ++ 2008.

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

Es ist in Ordnung, Kommentare und Leerzeilen vor sich zu haben.


0

Obwohl Sie _CRT_SECURE_NO_WARNINGS zu den Eigenschaften Ihres Projekts hinzufügen können , ist es am einfachsten, stdafx.h für jede Art von Warnung und Fehler zu verwenden. Stellen Sie jedoch sicher, dass Sie die folgende Zeile (und ähnliches) VORHER einfügen

#pragma once

Es ist auch nicht erforderlich, einen Wert (dh "1") für _CRT_SECURE_NO_WARNINGS zu definieren, solange dieser definiert ist. So sollte es aussehen:

#define _CRT_SECURE_NO_WARNINGS 

#pragma once

Das ist falsch. Die Reihenfolge macht keinen Unterschied. Überhaupt. Ich gehe davon aus, dass Sie nie erklärt haben, warum dies notwendig war, weil es keinen Grund gibt.
Unsichtbar

Dies ist keine Frage der "Reihenfolge", sondern nur doppelt überprüft: Wenn Sie #define _CRT_SECURE_NO_WARNINGS einmal nach #pragma setzen, wird dieser Fehler trotzdem angezeigt!
Michael Haephrati

Das Verhalten von #pragma onceist implementierungsdefiniert, folgt jedoch dem in Visual Studio üblichen De-facto-Standard. Wenn es für Sie einen Unterschied macht, ob Sie das Präprozessorsymbol vor oder nach dem Pragma definiert haben, liegt eine fehlerhafte Projektkonfiguration vor (dies setzt voraus, dass Sie "vorkompilierte Header" und "stdafx.h" zu Unrecht gleichsetzen " ).
Unsichtbar

Was bedeutet überhaupt "kaputte Projektkonfiguration"? Ich habe ein neues Win32-Projekt erstellt und beide Szenarien getestet.
Michael Haephrati

In der offiziellen Dokumentation finden Sie Informationen zu den tatsächlichen Anforderungen für die Verwendung dieses Präprozessorsymbols.
Unsichtbar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.