C LANGUAGE TECHNOLOGY

【C/C++言語】Visual StudioでC4996エラーを回避する4つの方法

悩んでいる人

Visual StudioでC言語のscanf関数を利用したら,C4996エラーが発生してビルドが失敗したんだけど...

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

C言語のC4996エラー

C言語のC4996エラーとは,Visual Studioで安全ではない標準ライブラリ関数を利用する際,ビルド時に発生するエラーです.

※C4996エラーは正確には警告ですが,便宜上エラーとして扱います.

C4996エラーが発生する標準ライブラリ関数として,scanf関数が挙げられます.

scanf関数を利用するコードは以下になります.

Visual Studioでビルドすると,12行目のscanf関数でC4996エラーが発生します.

代替方法として以下が記載されています.

  • scanf_s関数の利用
  • _CRT_SECURE_NO_WARNINGSをプリプロセッサでマクロ定義

Visual StudioでC4996エラーを回避する4つの方法

Visual StudioでC4996エラーを回避する4つの方法を紹介します.

  • プロパティのSDLチェックで無効
  • プリプロセッサで無効
  • 他のC言語の関数で代替
  • C++言語のクラスや関数で代替

C4996エラーをプロパティのSDLチェックで無効に設定

Visual Studio 2012からSecurity Development Lifecycle(SDL)チェックという機能が追加されたことで,C4996は警告からエラーに格上げされています.

C4996エラーをプロパティのSDLチェックで無効に設定するためには,以下の手順を行って下さい.

プロパティ SDL
プロパティ SDL2

設定が正常に完了するとC4996がエラーから警告に変更されますので,再度ビルドすると成功します.

実行結果は以下になります.正常に実行できました.

※他の方法の実行結果も同じなので,以降は省略します.

C4996エラーをプリプロセッサで無効に設定

C4996エラーをプリプロセッサで無効に設定する「ファイル全体」と「ファイルの一部」の2つの方法を紹介します.

ファイル全体でC4996エラーを無効に設定

ファイル全体でC4996エラーを無効に設定するためには,以下のプリプロセッサのどちらかを書きます.

_CRT_SECURE_NO_WARNINGSは,ファイルの先頭(stdio.h等のヘッダのインクルード前)で定義する必要があります.

これに対して,warning(disable:4996)はscanf関数等の呼び出し前で良いので,stdio.h等のヘッダのインクルード後でも可能ですが,ファイルの先頭に書いた方が無難です.

上記のプリプロセッサをファイルの先頭に書いた各々のコードは以下になります.

ファイルの一部を無効

ファイルの一部だけC4996エラーを無効に設定するためには,以下のようなプリプロセッサを書きます.

そして,C4996を無効にしたい行の前後をDISABLE_C4996とENABLE_C4996で挟みます.

上記のプリプロセッサを利用するコードは以下になります.

C4996エラーが発生しない他のC言語の関数で代替

C4996エラーが発生しない他のC言語の関数で代替します.

scanf関数の代替はscanf_s関数ですので,12行目をscanf_s関数の呼び出しに変更します.

他のC4996エラーが発生する関数は,「MSC24-C. の非推奨関数や時代遅れの関数」で推奨されている関数で代替できます.

参考:C++言語のクラスや関数で代替

Visual StudioのコンパイラはC/C++言語用なので,C言語の機能や関数のみで実装するという制約がなければ,C++言語のクラスや関数で代替できます.

C言語のscanf関数をC++言語の標準入力ストリームstd::cin(std::istreamクラスのオブジェクト)で代替するコードは以下になります.

※printf関数も標準出力ストリームstd::cout(std::ostreamクラスのオブジェクト)で代替しています.

まとめ

Visual StudioでC言語のC4996エラーを回避する4つの方法を紹介しました.

scanf関数を例にして,SDLチェックで無効に設定,プリプロセッサで無効に設定,他のC言語の関数で代替,C++言語のクラスや関数で代替する方法を解説しました.

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

友だち追加

独学が難しいあなたは,C言語を学べるおすすめのオンラインプログラミングスクール4社で自分に合うスクールを見つけましょう.

-C LANGUAGE, TECHNOLOGY
-, , , , , , , , , , , , , ,