先頭へ戻る

__STDC_LIB_EXT1__ | Programming Place Plus C言語編 標準ライブラリのリファレンス

Programming Place Plus トップページ -- C言語編 -- 標準ライブラリのリファレンス(名前順)

Programming Place Plus トップページ -- C言語編 -- 標準ライブラリのリファレンス(ヘッダ別)

先頭へ戻る

__STDC_LIB_EXT1__

概要

境界検査関数を実装する処理系であることを示す

ヘッダ

なし(事前定義マクロである)

形式

置換結果

境界検査関数を実装する処理系であれば 1 に置換される。

詳細

C11 で追加された境界検査関数を実装しているかどうかを表す。境界検査関数は、引数に配列(を指すポインタ)を指定するような関数において、その実際の要素数を超えた書き込みを行ってしまうような厄介な問題を検出する。例えば、危険な gets関数に対する境界検査関数として、gets_s関数がある。
実際に、境界検査関数を使用するには、該当の関数が宣言されている標準ヘッダをインクルードする前に、__STDC_WANT_LIB_EXT1__ という名前のマクロを、置換結果 1 として定義することが作法となっているが、これを行わずとも関数を使用できる処理系もあり得る。

注意

使用例

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>

int main(void)
{
    char buf[16];

    puts( "何か入力してください。" );
    
#ifdef __STDC_LIB_EXT1__
    gets_s( buf, sizeof(buf) );
#else
    fgets( buf, sizeof(buf), stdin );
    {
        char* p = strchr( buf, '\n' );
        if( p != NULL ){
            *p = '\0';
        }
    }
#endif

    puts( buf );

    return 0;
}

実行結果:

何か入力してください。
abcde
abcde

関連

境界検査関数を使用したいときには、__STDC_WANT_LIB_EXT1__ の定義を行う。

解説章


参考リンク


------------------------------------------------------------------------

更新履歴

'2018/4/27 新規作成。


------------------------------------------------------------------------

標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー