ลบคำเตือนที่ปลอดภัย (_CRT_SECURE_NO_WARNINGS) จากโครงการโดยค่าเริ่มต้นใน Visual Studio


196

มีวิธีการตั้งค่าเริ่มต้นสำหรับทุกโครงการที่ลบคำเตือนความปลอดภัย precompiler ที่เกิดขึ้นเมื่อใช้ฟังก์ชั่นเช่น scanf () ฉันพบว่าคุณสามารถทำได้โดยเพิ่มบรรทัดในตัวเลือกโครงการหรือ#define _CRT_SECURE_NO_WARNINGSในตอนต้นของรหัส

ฉันพบว่าตัวเองสร้างโครงการใหม่ ๆ หลายครั้งเพื่อแก้ไขการแข่งขันการเขียนโปรแกรมและมันน่ารำคาญจริงๆ (และใช้เวลาอันมีค่า) ในการเพิ่ม:

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

ในการเริ่มต้นของรหัสหรือการตั้งค่าในตัวเลือก precompiler ทุกครั้งที่ฉันเริ่มโครงการใหม่


2
คุณสามารถส่งออกเทมเพลตโครงการด้วยการกำหนด _CRT_SECURE_NO_WARNINGS
BlueWanderer

นั่นเป็นวิธีแก้ปัญหาที่ดี ฉันกำลังมองหามัน ขอบคุณ!
Juan Martinez

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
สิ่งนี้อธิบายวิธีเพิ่มสำหรับโครงการหนึ่งซึ่งฉันคิดว่า OP รู้แล้ว (แม้ว่าจะยังไม่ชัดเจน 100%) คำถามสำคัญคือวิธีการเพิ่มเพื่อให้ปรากฏในโครงการทั้งหมด โดยหลักการแล้วเราจะเพิ่มมันลงในแมโคร% (PreprocessorDefinitions) เพื่อให้มันถูกรวมไว้ได้ทุกที่ได้อย่างไร
Rob Gilliam

แก้ไข ณ วันที่ 13 มกราคม 2015

นี่อธิบายขั้นตอนแรกเท่านั้น เมื่อคุณกำหนดค่าทุกอย่างตามที่คุณต้องการแล้วคุณจะต้องส่งออกเทมเพลตโครงการด้วย (ดูวิธีการ: สร้างเทมเพลตโครงการสำหรับคำแนะนำ)
IIsspectable

92

อาจเป็นเพราะฉันยังใหม่กับ VS และแน่นอนใหม่กับ C แต่สิ่งเดียวที่อนุญาตให้ฉันสร้างได้เพิ่ม

#pragma warning(disable:4996)

ที่ด้านบนของไฟล์นี้ระงับข้อผิดพลาด C4996 ที่ฉันได้รับด้วย sprintf

น่ารำคาญนิดหน่อย แต่ก็เหมาะสำหรับโค้ดเล็ก ๆ ของฉันและง่ายที่สุด

ฉันอ่านเกี่ยวกับที่นี่: https://msdn.microsoft.com/en-us/library/2c8f766e.aspx


5
ฉันลองทุกรูปแบบของ #define ที่แสดงในหน้านี้ (ที่มีและไม่มี 1 ที่ส่วนท้าย) และมีเพียง #pragma ที่เหมาะกับฉัน (รุ่นชุมชน VS2013) ฉันแน่ใจว่าฉันขาดอะไรบางอย่าง แต่ในบางจุดคุณเพียงต้องการให้มันทำงานเพื่อที่คุณจะได้สามารถทำมันต่อไปได้
Spike0xff

มีสิ่งเดียวกันที่แน่นอน - รู้สึกอึ แต่ในตอนท้ายของวันดี f *** มันใช้งานได้ @ Spike0xff
Shaun314

2
ฉันสามารถยืนยัน _CRT_SECURE_NO_WARNINGS ไม่ทำงานใน VC ++ 2015 แต่ทำงานได้ดีกว่า ขอบคุณ!
Shital Shah

@ShitalShah การยืนยันของคุณขึ้นอยู่กับการทดลองส่วนตัวหรือเอกสารทางการของ Microsoft บางส่วน?
qqqqq

1
@bri: การตั้งค่าเริ่มต้นโดยไม่มีเงื่อนไขอาจมีผลกระทบที่ไม่พึงประสงค์ คุณตั้งใจจะคืนค่าพฤติกรรมให้เหมือนเมื่อก่อน ในการทำเช่นนั้นให้ใช้#pragma warning(push)/#pragma warning(pop)แทน
IIsspectable

29

ไม่อัตโนมัติไม่ คุณสามารถสร้างเทมเพลตโครงการตามที่แนะนำBlueWandered หรือสร้างแผ่นคุณสมบัติแบบกำหนดเองที่คุณสามารถใช้สำหรับโครงการปัจจุบันและอนาคตทั้งหมดของคุณ

  1. เปิดตัวจัดการอสังหาริมทรัพย์ (ดู -> ตัวจัดการอสังหาริมทรัพย์)
  2. ในตัวจัดการอสังหาริมทรัพย์คลิกขวาที่โครงการของคุณและเลือก "เพิ่มแผ่นคุณสมบัติของโครงการใหม่"
  3. ตั้งชื่อและสร้างในไดเรกทอรีทั่วไป แผ่นคุณสมบัติจะถูกเพิ่มไปยังเป้าหมายการสร้างทั้งหมด
  4. คลิกขวาที่แผ่นคุณสมบัติใหม่แล้วเลือก "Properties" สิ่งนี้จะเปิดคุณสมบัติและอนุญาตให้คุณเปลี่ยนการตั้งค่าเช่นเดียวกับที่คุณทำหากคุณแก้ไขมันสำหรับโครงการ
  5. ไปที่ "คุณสมบัติทั่วไป -> C / C ++ -> ตัวประมวลผลล่วงหน้า"
  6. แก้ไขการตั้งค่า "ข้อกำหนดของตัวประมวลผล_CRT_SECURE_NO_WARNINGSล่วงหน้า" และเพิ่ม
  7. บันทึกและคุณทำเสร็จแล้ว

ตอนนี้เมื่อใดก็ตามที่คุณสร้างโครงการใหม่เพิ่มแผ่นคุณสมบัตินี้ ...

  1. เปิดตัวจัดการอสังหาริมทรัพย์ (ดู -> ตัวจัดการอสังหาริมทรัพย์)
  2. ในตัวจัดการอสังหาริมทรัพย์คลิกขวาที่โครงการของคุณและเลือก "เพิ่มแผ่นคุณสมบัติของโครงการที่มีอยู่"

ประโยชน์ที่นี่คือไม่เพียง แต่คุณจะได้รับที่เดียวสำหรับจัดการการตั้งค่าทั่วไป แต่ทุกครั้งที่คุณเปลี่ยนการตั้งค่าที่พวกเขาได้แพร่กระจายไปยังโครงการทั้งหมดที่ใช้งาน สิ่งนี้มีประโยชน์หากคุณมีการตั้งค่าจำนวนมากเช่น_CRT_SECURE_NO_WARNINGSหรือไลบรารีเช่น Boost ที่คุณต้องการใช้ในโครงการของคุณ


ที่น่ากลัว. ฉันไม่อยากจะเชื่อเลยว่าฉันไม่เคยค้นพบผู้จัดการอสังหาริมทรัพย์จนถึงวันนี้
James Johnston

20

โซลูชันทั้งหมดที่นี่ไม่สามารถทำงานกับ VS2013 ของฉันได้ แต่ฉันใส่#define _CRT_SECURE_NO_WARNINGSstdafx.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 .. ) แน่นอนว่าฉันชอบก)

ฉันสามารถยืนยันได้ว่า: #define _CRT_SECURE_NO_WARNINGS (โดยไม่มีค่า) ไม่ทำงาน

ป.ล. จุดที่แท้จริงคือการกำหนดสิ่งเหล่านี้ก่อนการประกาศฟังก์ชั่นเช่นก่อน * .h


ทำงานใน Visual Studio 2010 เช่นกัน
ebyrob

8

เพียงแค่คัดลอก " _CRT_SECURE_NO_WARNINGS " วางไว้ในโครงการ -> คุณสมบัติ -> c / c ++ -> preprocessor-> คำจำกัดความของตัวประมวลผลล่วงหน้า คลิก 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

สิ่งนี้ไม่ถูกต้อง คำสั่งซื้อไม่ได้สร้างความแตกต่าง เลย ฉันสมมติว่าคุณไม่เคยอธิบายว่าทำไมสิ่งนี้ถึงจำเป็นเพราะไม่มีเหตุผล
IInspectable

นี่ไม่ใช่เรื่องของ "คำสั่ง" เพียงแค่ตรวจสอบสองครั้ง: หากคุณวาง #define _CRT_SECURE_NO_WARNINGS หลังจาก #pragma หนึ่งครั้งคุณจะยังคงได้รับข้อผิดพลาดนี้!
Michael Haephrati

พฤติกรรมของ#pragma onceการใช้งานที่กำหนดไว้ แต่เป็นไปตามมาตรฐานทั่วไปใน Visual Studio ถ้ามันทำให้ความแตกต่างสำหรับคุณไม่ว่าจะเป็นคุณกำหนดไว้ข้างหน้าสัญลักษณ์ preprocessor ของ pragma หรือหลังจากนั้นแล้วคุณมีการกำหนดค่าโครงการเสีย (นี่คือสมมติว่าคุณเป็น - ไม่เหมาะ - เท่า"ส่วนหัว precompiled"และ"stdafx.h " )
IIsspectable

อะไรคือความหมายของ“ การกำหนดค่าโครงการที่เสีย” ฉันสร้างโครงการ Win32 ใหม่และทดสอบทั้งสองสถานการณ์
Michael Haephrati

โปรดดูที่เอกสารอย่างเป็นทางการเพื่อเรียนรู้เกี่ยวกับข้อกำหนดที่แท้จริงสำหรับการใช้สัญลักษณ์ตัวประมวลผลนี้
IInspectable
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.