9

MSVC ++には、大文字と小文字を区別しないC文字列の比較のための関数strcmpiがあります。

使ってみると、

このPOSIX関数は、Visual C ++ 2005以降で非推奨になりました。代わりに、ISOC++準拠の_stricmpを使用してください。

ISOがMSVC++にstrcmpiを使用させたくない理由、_stricmpが好ましい方法である理由、関数の名前を変更する必要がある理由、アンダースコアISO準拠で始まる関数はどのようになっているのかがわかりません。私はこれすべてに理由があるに違いないことを知っています、そして私はstrcmpiが非標準であり、おそらくISOが非標準の拡張を_underscoreで始めることを望んでいるのでそれを疑っていますか?

4

4 に答える 4

13

ISO Cは、"str" で始まるものを含め、将来の拡張 (こちらを参照) のために特定の識別子を予約しています。

于 2009-12-27T01:14:37.327 に答える
12

IMNSHO さん、これは Microsoft の言い方です「Windows マシンに Unix ソフトウェアを置かないでください」。この問題には、いくつかの苛立たしい側面があります。

  1. strcmpi()は POSIX 関数ではありません - 関連する関数は で定義され<strings.h>、呼び出されますstrcasecmp()
  2. POSIX 関数のサポートを明示的に要求した場合でも、Microsoft は、POSIX 名を使用することはできず、先頭に下線を付ける必要があると考えています。
  3. 私の知る限り、この問題に関する MSVC コンパイラの見解をオーバーライドする方法はありません。

とは言うものの、GCC ツール チェーンはいくつかの機能について少しぎこちないものになっていますmktemp()。ただし、(正当化された) 警告にもかかわらず、コンパイルとリンクは正常に行われます。

MSVCのボンネットにもミツバチがいることに注意してくださいsnprintf()。それらの関数が (コンパイラの残りの部分と共に) C99 標準に準拠している場合、オーバーフローのリスクはありません。Microsoft の主張に反して、標準では null 終了が必要です。

この問題に対する本当に良い解決策はありません。解決策があるかどうかはわかりません。1 つの可能性は、ヘッダー (またはヘッダーのセット) を作成して、実際のすべての POSIX 名を Microsoft のそれらの誤解にマップすることです。もう 1 つは、それぞれが Microsoft バージョンの名前を呼び出す正しい POSIX 名を持つ単純な関数のライブラリを作成することです (宣言行、左中括弧、右中括弧、および右中括弧の 4 行の関数の膨大なコレクションが得られます)。 POSIX 関数名の Microsoft バリアントを呼び出す return ステートメント。

ユーザーの名前空間を汚染する Microsoft API 呼び出しが廃止されたり、名前が変更されたりしていないのは興味深いことです。

于 2009-12-27T02:19:41.127 に答える
3

アンダースコアと小文字で始まる名前は、グローバル名前空間で宣言されている場合、C++実装用にC++標準によって予約されています。これにより、この命名規則を使用してはならない独自のコード内の類似した名前との衝突を防ぐことができます。

于 2009-12-27T01:04:46.113 に答える
2

strcmpiVisual C ++ 2008では完全に廃止されるため、アップグレードする場合は、非推奨に注意する必要があります。

_は関数をISO標準にしません。それは、言語が使用するために予約されている名前空間の一部であるため、言語が進化するにつれて_で始まる関数を追加する方が安全です。

Microsoftのドキュメントに_stricmpよると、いくつかの慣例があり、直感的でない順序になっているようstrcmpiです(大文字と小文字を単に無関係として扱うのではなく、小文字に正規化することを含む)。_stricmp自然に期待することをするのにもっと苦労するように聞こえます。

于 2009-12-27T01:16:05.127 に答える