3

私は名前空間を正しい(または少なくとも最良の)方法で使い始めようとしています。

私が最初にやろうとしたことusing namespace xxx;は、ファイルの先頭に置かないようにすることでした。using xxx::yyy代わりに、私は可能な限りローカルにしたいと思います。

これを説明する小さなプログラムは次のとおりです。

#include <iostream>
#include <cstdlib>
#include <ctime>

int main() {
   using std::cout;
   using std::endl;

   srand(time(0));

   for(int i=0; i<10;++i)
      cout << rand() % 100 << endl;

   return 0;
}

using std::cout;行またはを省略した場合、またはusing std::endlを使用しようとするとコンパイラが文句を言います。coutendl

しかし、なぜこれは、、およびに必要ないのsrandですrandtimestd私がそれらの前に具体的に注ぐことを試みた場合std::、私のコードは正常に機能しているので、私はそれらが入っているとかなり確信しています。

4

4 に答える 4

6

cstdlibetalを使用する場合。それらの名前は、グローバル名前空間とstd ::名前空間の両方に配置されるため、接頭辞としてstd::を付けるかどうかを選択できます。これは、一部の人には機能と見なされ、他の人には誤った機能と見なされます。

于 2010-01-22T09:37:30.423 に答える
3

読みやすさを維持するために、使用を省略し、毎回std::coutを使用することを好みます。これはおそらく大規模なプロジェクトでのみ役立ちますが

于 2010-01-22T09:34:34.307 に答える
3

本当に知りたい場合は、ctimecstdlibヘッダーをよく見てください。それらは下位互換性があります。

注:これとビジネスのすべてusingusing namespace、読みやすさに関するものです。IDEで名前空間を表示したくないときに表示できない場合は、これらの構造は必要ありません...

于 2010-01-22T09:33:16.410 に答える
0

この件に関しては、 Koenig Lookupと呼ばれるものもあります。これを使用すると、関数名の前にある名前空間識別子を、引数が同じ名前空間からのものである場合に省略できます。

例えば

#include <iostream>
#include <algorithm>
#include <vector>

void f(int i){std::cout << i << " ";}
int main(int argc, char** argv)
{
   std::vector<int> t;
   // for_each is in the std namespace but there's no *std::* before *for_each*
   for_each(t.begin(), t.end(), f); 
   return 0;
}

まあ、直接関係はありませんが、役に立つかもしれませんが。

于 2010-01-22T09:46:07.067 に答える