17

この MSDN の記事では、getcwd() は非推奨であり、代わりに ISO C++ 互換の _getcwd を使用する必要があると述べています。

4

7 に答える 7

26

それについては良い議論があります。PJ プラウガーがこれに答える

私は 1983 年に、C プログラムで使用できる名前のスペースを次のように分割することを主張した人物です。

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

その時でさえ、「実装」がモノリシックすぎることはわかっていました。多くの場合、複数のソースが実装のビットを提供します。しかし、それが当時私たちができる最善のことでした。標準 C++ では名前空間が導入されましたが、それらは宣言された目標のほんの一部しか達成していません。(これは、紙の虎を標準化すると起こることです。)

この特定のケースでは、Posix は、特定のヘッダーを含める場合にのみ定義する必要があるカテゴリ (a) 名 (unlink など) のリストを提供します。C 標準は、Posix と同じソースである Unix からヘッダーを盗んだため、これらのヘッダーの一部は歴史的に重複しています。それにもかかわらず、コンパイラの警告には、サポートされている環境が「純粋な」標準 C++ (プラトンの理想) であるか、C/C++/Posix の混合環境であるかを考慮に入れる何らかの方法が必要です。貧弱なプログラマーを助けようとする Microsoft の現在の試みは、それを考慮に入れていません。unlink をカテゴリ (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 で操作していることを明示的に伝える必要があります。gnu89その後、混合環境を想定したデフォルトになります ( man feature_test_macros)。どうやら、MSVC にはその可能性がありません。

于 2009-03-15T13:22:03.290 に答える
20

標準で指定されていない関数には、ベンダー固有の拡張機能であるか、非 ISO 標準に準拠していることを示すために、アンダースコアを前に付ける必要があります。したがって、ここでの「準拠」とは、Microsoft がこの特定の関数の名前にアンダースコアを追加することでした。これは、ISO 標準の一部ではないためです。

于 2009-03-15T12:17:23.100 に答える
4

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

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

于 2009-03-15T12:28:16.397 に答える
4

記録として、getcwd()ISO によって廃止されていません。Microsoft によって「廃止」されました。Microsoft は、多くの C 関数を書き直しました。多くの場合、セキュリティを少し強化することを念頭に置いています (たとえば、max_lengthパラメーターも受け取る文字列関数など)。その後、彼らはコンパイラにこれらの警告を吐き出させました。これは、非推奨と宣言された関数を非推奨にする標準グループがないため、私は偽物だと考えています。

于 2009-07-07T19:04:23.970 に答える
3

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

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

于 2009-03-15T12:13:42.110 に答える
3

Dan Olson の投稿に追加するには: MSDN のANSI C Complianceページを参照してください。

Microsoft 固有の関数とグローバル変数の名前は、単一のアンダースコアで始まります。これらの名前は、コードの範囲内でローカルにのみオーバーライドできます。たとえば、Microsoft ランタイム ヘッダー ファイルをインクルードする場合でも、同じ名前のローカル変数を宣言することで、_open という名前の Microsoft 固有の関数をローカルでオーバーライドできます。ただし、この名前を独自のグローバル関数またはグローバル変数に使用することはできません。

于 2009-03-15T12:19:12.627 に答える
3

MSDN の記事は、通常の人が簡単に読んだだけで結論を下すと、やや混乱します (非常に注意深い弁護士の目で読まなければ)。

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

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

于 2010-01-27T23:28:06.183 に答える