6

WindowsライブラリをAndroidに移植しています(GNU標準C ++ライブラリオプション、libstdc ++-v3を使用)。VCライブラリとGNUライブラリの間には、名前の違いが多数あるようです。例:

  • _stricmpstrcasecmp代わりに呼び出されます
  • _unlinkと呼ばれるunlink
  • _scalbと呼ばれるscalbn
  • _finiteと呼ばれるisfinite
  • _isnanと呼ばれるisnan
  • _itoaGNUC++には存在しitoaないようです
  • atoi存在しますが、存在しませんatoi64

VCライブラリとGNUライブラリの両方のドキュメントは、それらが「ISO」C ++を実装していることを示しています。たとえば、次のような「ISO C ++」名を使用していない場合、VC2008からいくつかの警告を受け取ることができます。このアイテムのPOSIX名は廃止されました。代わりに、ISO C++準拠の名前_itoaを使用してください。」同様に、GNUのマニュアルには、「GNU標準C++ライブラリv3はISO14882標準C++ライブラリを実装するための進行中のプロジェクトです」と書かれています。

では、ライブラリはどのようにしてこれらの異なる名前になってしまうのでしょうか。どの名前がより「標準的」であるかをどのように判断できますか?

また、libstdc ++-v3のインデックスはどこかにありますか?つまり、ライブラリ内のすべての関数の単純なリストですか?機能のリストを提供していないように見えるマニュアルと「ソースドキュメント」しか見つかりません。

4

3 に答える 3

12

これは、C++標準ライブラリとはほとんど関係がありません。それはC99とPOSIXともっと関係があります。

  • strcasecmplibstdc++がたまたま実装するPOSIX関数です。msvcrtは通常、POSIXからアームの長さに留まります。
  • unlink似ています—これはPOSIX関数です。
  • scalbnC99標準の関数の名前です。MSVCはC99をサポートしていません。ただし、scalbnこれはC ++ 11の一部であるため、最終的にはmsvcrtに表示されると思います。
  • isfiniteisnanは両方ともC99です。
  • itoaC99でもPOSIXでもありません。夜に現れるのは不思議な獣です。

また、他のいくつかが指摘していることも指摘します。実際には非標準である標準ライブラリ内の関数の前にアンダースコアを付ける方が技術的に正しいです。これが、msvcrtでアンダースコアが急増する理由です。

于 2012-03-27T19:44:59.183 に答える
2

それらのどれも標準ではありません。標準では、名前を追加するべきではないとされていますが、それが警告の実際の意味です。アンダースコアは、標準のC / C ++で何かと混同されないため、標準に準拠しています。

それらは、アンダースコアを追加することにより、コードが標準で何かを使用することを意味しますが、どちらのバージョンも使用していません。

于 2012-03-27T19:45:36.437 に答える
1

これらの識別子は標準によって実装に予約されていることが保証さ_れているため、関数名の前に追加して必要な処理を実行すれば、どの実装でも実装を「ISO標準」と呼ぶことができると思います。ただし、ポータブルであるとは限りません。

于 2012-03-27T19:45:04.173 に答える