Googleですばやく検索しても何も見つからなかったので、ここで質問します(gcc/clangに関係する多くの人がここにいるため)-gcc/clangの__STDC_LIB_EXT1__
のステータスはどうなっていますか?クロスプラットフォームアプリケーションを開発しており、<stdio.h>
(奇跡的にVisual Studio 2017で利用可能)の安全境界チェック関数のいくつかを使用したかったのですが、Xcode9.2でコードをコンパイルできませんでした。 Xcodeが使用するclangバージョンは古くなっていると思いますが、Ubuntuのgcc6.3.0は同じように動作します。次のサンプルで tmpnam_s を使用しようとしています。
#if defined(__STDC_LIB_EXT1__)
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#else
#error "__STDC_LIB_EXT1__ not defined"
#endif
int main(int argc, char** argv)
{
char t[L_tmpnam_s];
tmpnam_s(t, L_tmpnam_s);
return 0;
}
しかし、マクロが定義されていないため、コンパイルは失敗します。
gcc -std=c11 test.c
test.c:5:2: error: #error "__STDC_LIB_EXT1__ not defined"
#error "__STDC_LIB_EXT1__ not defined"
^~~~~
私は何か間違ったことをしていますか、それともこの関数セットは単にサポートが不十分ですか?
_s
サフィックスが付いた「safe」関数のセット全体は十分にサポートされていません。 Microsoftは、_s
接尾辞を付けて一連の関数を作成し、標準化するためにC標準委員会に提出しました。委員会は(おそらく必然的に)いくつかの変更を加え、テクニカルレポートTR24731-1を作成しました。 TRの軽度に変更されたバージョンは、オプションのAnnex K(規範)としてC11標準、ISO/IEC 9899:2011に含まれていました。
TR-24731の「より安全な」関数を使用していますか? 、特にその質問に対する私の answer のメモ、特に標準C委員会文書へのリンク Annex KでのN1967現場経験—境界チェックインターフェース 。
N1967の提案の現状はわかりませんが、提案されたことがわかります。 N1967には、Annex K/TR-24731-1をサポートするライブラリへのリンクも含まれています—リストは限られています。
Microsoftは、C11標準で指定されたライブラリを実装していないことに注意してください。標準への近似を実装しますが、決定的な違いがあります。他のシステムが標準を実装している場合、これはさらに重要になりますが、関数は広く受け入れられている形式で実装されていません(たとえば、GNU Cライブラリはサポートしておらず、サポートしませんそれら)。