質問
この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標準ライブラリに含めることを決定しました(ただし、これらの関数の前にアンダースコアを付けて、基本的に使用を妨げています)。
Dan Olsonの投稿に追加するには: ANSI C準拠 MSDNのページ
Microsoft固有の関数とグローバル変数の名前は、単一のアンダースコアで始まります。これらの名前は、コードのスコープ内でローカルでのみオーバーライドできます。たとえば、Microsoftランタイムヘッダーファイルを含める場合、同じ名前のローカル変数を宣言することで、_openという名前のMicrosoft固有の関数をローカルでオーバーライドできます。ただし、独自のグローバル関数またはグローバル変数にこの名前を使用することはできません。
私が知る限り、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標準呼び出しが何であるかを示していません...しかし、それは人々が一目で読む傾向があるものです。