Sửa lỗi Error C4996 _getch và getch scanf_s và scanf

Posted on March 9th, 2017

Kể từ phiên bản Visual Studio 2013 trở đi, một số hàm không còn được dùng nữa như: scanf, getch ... Các hàm này có thể không an toàn, lỗi thời và Microsoft đã thay bằng hàm _getch, scanf_s, printf_s.. an toàn hơn. Sau đây là tổng hợp các cách sửa lỗi Error C4996.

Error C4996 'getch': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _getch. See online help for details.
Error C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

Sự khác nhau giữa _getch và getch, scanf_s và scanf

Không có sự khác biệt giữa chức năng của các hàm này. Trên thực tế, chúng thường chỉ là hai tên khác nhau để có cùng một chức năng.

Cách tắt cảnh báo lỗi C4996

Có rất nhiều cách để tắt Error C4996

Cách 1: Dùng pragma

Bạn thêm dòng sau vào trước hàm main

#pragma warning( disable : 4996 )

Cách 2: Dùng #define

Bạn thêm 2 dòng sau vào dòng đầu tiên của code. Nếu đặt sau các khai báo thư viện sẽ không có tác dụng.

#define _CRT_NONSTDC_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS

Cách 3: Dùng Preprocessor Definitions

Cách này về cấu trúc giống cách 2, nhưng hơi lâu chút.

Bạn bấm chuột phải vào tên project, chọn Properties (Alt+Enter).

Trong Configuration Properties chọn C/C++ -> Preprocessor  -> Preprocessor Definitions.

Thêm dòng này "_CRT_NONSTDC_NO_WARNINGS; _CRT_SECURE_NO_WARNINGS" như hình dưới rồi bấm OK là xong.

Cách 4: Không dùng SDL khi tạo project

Khi mới tạo project, bạn bỏ chọn "Security Development Lifecycle (SDL) checks". Như vậy sẽ không còn cảnh báo lỗi c4966 nữa, đơn giản nhưng ít ai để ý.

Tham khảo: msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k(C4996)&rd=true