Visual Studio 2013 預設啟用「安全開發生命週期」(SDL) 檢查,將 strcpy、sprintf、scanf 等標準 C 庫函數標記為「不安全」,導致編譯錯誤 C4996。本文提供三種解決方案,按推薦程度排序。
在項目屬性 → C/C++ → 預處理器 → 預處理器定義 中添加:
_CRT_SECURE_NO_WARNINGS
或在源文件最開頭(包含頭文件前)定義:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
// ...
原理:該宏通知 CRT 頭文件不發出 _CRT_INSECURE_DEPRECATE 警告,保留標準函數名稱。適用於快速移植舊代碼、競賽編程、教學演示。
| 標準函數 | 安全版本 (MSVC) | 關鍵差異 |
|---|---|---|
strcpy | strcpy_s(dest, destsz, src) | 需指定目標緩衝區大小 |
sprintf | sprintf_s(buf, size, fmt, ...) | 需指定緩衝區大小 |
scanf | scanf_s(fmt, ..., buf, size) | 字符/字符串參數需額外傳長度 |
strcat | strcat_s(dest, destsz, src) | 同上 |
fopen | fopen_s(&fp, path, mode) | 返回錯誤碼,fp 通過指針輸出 |