2

コンパイラ(Visual C ++)は、入力すると常に修正されますflushall();

警告C4996:'flushall':このアイテムのPOSIX名は非推奨です。代わりに、ISO C++準拠の名前_flushallを使用してください。

どちらも私のために働いていますが、何か違いはありますか?

4

2 に答える 2

9

この警告は無意味です。flushallはPOSIXではなく、私の知る限り、そうではありませんでした。開いているすべての stdio ストリームをフラッシュする正しい ISO C の方法は、fflush(NULL);.

この問題にさらに光を当てるために、これはVisual CがC標準の一部ではないが、標準ライブラリが最低限の互換性のために持っている関数に対して使用する一般的な警告メッセージだと思います。これらの関数のほとんどは や のようなものopenであり、漠然と同じ名前のPOSIXread関数に対応しており、stdio などの基礎となる下位レベルのプリミティブと考えることができます。flushallただし、さまざまなレガシーユニックスからコピーされた奇妙な関数に基づいています。

これらの関数は実際には C (または C++) 標準の一部ではなく、C 標準 (およびおそらく C++ 標準も...?) は、標準で明示的に定義または予約されていないアプリケーション識別子を予約しているため、非です。openや などの標準ヘッダー名を公開するための準拠flushall。POSIX は、機能テスト マクロを使用してこれを回避します。これにより、アプリケーションは実装明示から必要な名前空間を保証することができますが、Microsoft は代わりに、POSIX のような名前を非推奨にし、アンダースコアを前に付けた代替関数セットを提供するというアプローチを取りました。実装。警告は、これらの Microsoft 固有の名前を使用することを推奨しています。これにより、ヘッダーで厳密な名前空間の準拠のためにオプション (おそらくコンパイラ スイッチのマクロによって制御される) をオンにした場合でもコードがコンパイルされます。

残念ながら、Microsoft が推奨する方法で名前にアンダースコアを付けてコードを記述すると、コードは完全に移植できなくなります。これらの名前は実装用に予約された名前空間にあるため、他のプラットフォームはまったく異なることを行う関数に同じ名前を使用する可能性があります#define。他の機能へ。

要するに、この警告を生成している警告フラグを見つけて、それをオフにします。そのような標準関数は「安全ではない」というFUDを吐き出すものに加えて、代わりに_s-suffixed関数を使用する必要があります。ただし、必要な関数が だけの場合はfflushall()、 に置き換えるだけで準備fflush(NULL);完了です。

于 2012-10-26T17:43:18.873 に答える