getcwd()がISO C ++に準拠していないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/647704

  •  22-07-2019
  •  | 
  •  

質問

このMSDN記事では、getcwd()が廃止され、代わりにISO C ++互換の_getcwdを使用する必要があります。これにより、getcwd()がISOに準拠しなくなる原因は何ですか?

役に立ちましたか?

解決

標準で指定されていない関数には、ベンダー固有の拡張機能であるか、非ISO標準に準拠していることを示すために、アンダースコアがプレフィックスとして付けられます。したがって、「コンプライアンス」はこれは、Microsoftがこの特定の関数の名前に下線を追加するためのものでした。これは、ISO標準の一部ではないためです。

他のヒント

良い議論それについて。 P.J.プラウジャーはこれに答えます

  

私は1983年にそのスペースを主張した男です   Cプログラムで使用可能な名前は、次のように分割されます。

     

a)プログラマーのために実装で定義されたもの(printfなど)
    b)プログラマーに予約されているもの(fooなど)
    c)実装用に予約されているもの(_unlinkなど)

     

「実装」がそのことを知っていましたが、モノリシックすぎる-   多くの場合、複数のソースが実装のビットを提供します-   しかし、それは私たちが当時できることでした。標準C ++   名前空間を導入して支援しましたが、達成したのは   記載されている目標の一部。 (それはあなたが   紙のトラを標準化します。)

     

この特定の場合、Posixはカテゴリ(a)名のリストを提供します   (リンク解除など)は、次の場合にのみ定義されます。   特定のヘッダーを含めます。 C標準はヘッダーを盗んだため、   Unix、これはPosixと同じソースであり、それらのヘッダーの一部   歴史的に重複しています。それにもかかわらず、コンパイラの警告には   サポートされている環境かどうかを考慮する何らかの方法   「純粋」です標準C ++(プラトンの理想)または混合C / C ++ / Posix   環境。貧しい人々を助けるためのマイクロソフトによる現在の試み   プログラマーはそれを考慮に入れていません。それは治療を主張します   カテゴリ(b)名としてリンクを解除します。これは近視です。

さて、GCCは少なくとも厳密なCモードではPOSIX名を宣言しません(ただし、C ++モードではまだ宣言します):

#include <stdio.h>

int main() {
    &fdopen;
    return 0;
}

-std = c99

を使用した出力
test.c: In function 'main':
test.c:4: error: 'fdopen' undeclared (first use in this function)

機能テストマクロを使用するか、特定の規格に合格しないことにより、C / Posix混合環境で操作していることを明示的に伝える必要があります。次に、混合環境( man feature_test_macros )を想定した gnu89 がデフォルトになります。どうやら、MSVCにはその可能性はありません。

他の人がすでに指摘しているように、getcwdはISO C ++には含まれていませんが、 POSIX / IEEE Std 1003.1。

Microsoftは、最も一般的に使用されるPOSIX関数の一部をC標準ライブラリに含めることを決定しました(ただし、これらの関数の前にアンダースコアを付けて、基本的に使用を妨げています)。

私が知る限り、getcwd()はISO標準C ++の一部ではありませんでした。標準名はアンダースコアで始まらないため、_getcwd()は絶対にそうではありません。

実際、MSDNの記事は、標準C ++ヘッダーファイルではない direct.h で宣言されていると記載されているマニュアルページにリンクしています。この記事は私には偽のようです。

レコードの場合、 getcwd()はISOによって非推奨になりませんでした。 「廃止予定」でしたマイクロソフトによる。マイクロソフトは多くのC関数を書き直しました。多くの場合、少しだけ優れたセキュリティを念頭に置いています(たとえば、 max_length パラメーターも使用する文字列関数)。その後、コンパイラはこれらの警告を吐き出しました。これは、非推奨と宣言された関数のいずれも非推奨とする標準グループが存在しないため、偽と考えられます。

MSDNの記事は、普通の人がただの速読で結論を下すのはやや混乱しています(非常に慎重な弁護士の目で読んでいない場合)。

MSDNの記事によると、getcwd()はISO C ++標準に準拠していません。関数の命名に関するISO C ++標準(getcwdが違反するもの)に準拠するために、Microsoftは関数の前に_を適切に配置しているため、同じ関数は_getcwd()になります。 getcwd()と_getcwd()はISO C ++標準関数ではなく、Microsoft(ベンダー)固有または実装固有の関数であるため、これはISO C ++準拠の関数命名方法です。

この記事は、作業ディレクトリを取得するためのC ++ ISO標準呼び出しが何であるかを示していません...しかし、それは人々が一目で読む傾向があるものです。

scroll top