6

そのため、C++プログラムでlibcが必要になっています。ただし、グローバル名前空間全体に散らばるというアイデアは好きではありません。理想的には、libc全体を名前空間に強制しstd::たいので、std::memcpyではなく実行する必要がありmemcpyます。

これは可能ですか?そしてどうやって?必要に応じて、コンパイラ固有のマクロを使用します(MS VC ++10.0およびGCC4.6のみを対象としています)。

編集:私は文字通り「宣言をstdに強制する」という意味です-std::プレフィックスなしでは呼び出せないようにします。また、cstdioではなく、を含めていstdio.hます。

ありがとう!

4

4 に答える 4

1

すでに完了していない限り、これを行うことはできません。

名前空間stdは標準ライブラリに予約されています。この名前空間に新しいメンバーを追加することは禁止されています。したがって、C ヘッダーがまだ に埋め込まれていstdない場合は、それを受け入れるしかありません。

一方、新しい名前空間を完全に作成し、ディレクティブcstdを使用してグローバル名前空間からシンボルを持ち込むことはできますが、グローバル名前空間からシンボルが消えるusingことはありません。

于 2011-02-06T10:25:10.773 に答える
1

私は文字通り「宣言を std に強制する」ことを意味します - std:: 接頭辞なしではそれらを呼び出すことができないようにします。

実装がグローバル名前空間で名前を公開している場合、これを行うことはできません。<cXXX> ヘッダーを使用してから、自分で std:: を使用できます。

これは残念なことかもしれませんが、C は名前空間を理解しないため、C との互換性の結果です。C++ は伝統的に、C との互換性のために多くの工夫と犠牲を維持してきました。

于 2011-02-05T20:45:22.897 に答える
0

ラッパーにインクルードを作成

//stdlib.hpp
namespace std
{
#include <stdlib.h> //edit: changed from cstdlib to stdlib.h
}

リンカがこれを嫌う場合は、必要な関数を宣言してみてください。

namespace std{ extern "C" {

int memcpy( void *out, const void *in);
} }
于 2011-02-05T20:23:36.863 に答える
0

一部の (ほとんどの?) C++ コンパイラがグローバル名前空間に C 関数を持っている理由は、既存のオペレーティング システム関数を使用する必要があるためです。たとえば、ファイル関数は個別の C ライブラリではなく、OS のファイル処理である場合があります。

于 2011-02-06T11:07:09.453 に答える