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

先頭へ戻る

__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 に保存 Twitter でツイート Twitter をフォロー
Facebook でシェア Google+ で共有 LINE で送る rss1.0 取得ボタン RSS
管理者情報 プライバシーポリシー