C ++への移行C

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/dxd_123456/article/details/77970763

C ++、C強化し
、1を名前空間
大規模なソフトウェアにメディアを頻繁にいくつかのプログラマによって開発された変数や関数の多くを使用して、必然的に変数や関数名の競合が存在します。コードテストの所有者は、何の問題を通過しない場合、それらは競合が命名されてもよく、互いに結合されます。

競合が開発命名の問題を解決するために、C ++は、名前空間(名前空間)の概念を導入しています。

異なる部分にグローバルネームスペースの範囲
名前空間識別子が競合することなく、同じ名前であってもよい
名前空間入れ子にすることができ
、グローバルスコープとも呼ばれるデフォルトの名前空間

定義された名前空間:
C ++キーワードで名前空間が名前空間の構文を定義するために使用されている:
名前空間名
{
変数
関数の
クラス
}
名前が名前空間の名前であり、変数、関数、クラス、タイプ定義を含むことができるものは、 #define、そして最後に、{}で囲まれた
場合:


// 定义一个命名空间,名字叫NameSpaceA
namespace NameSpaceA
{
    int a = 0;
}

// 命名空间的定义可以嵌套
namespace NameSpaceB
{
    int a = 1;

    namespace NameSpaceC
    {
        struct Teacher
        {
            char name[10];
            int age;
        };
    }
}

名前空間を使用:
ドメイン解決演算子を使用して

// ::是一个新符号,称为域解析操作符,在C++中用来指明要使用的命名空间。
NameSpaceA::a = 10;   // 使用命名空间 NameSpaceA中的变量a
NameSpaceB::a = 20;   // 使用命名空间 NameSpaceB中的变量a

宣言を使用して

// 在这里用using声明了 NameSpaceA::a, 它的意思是在声明以后的程序中如果出现
// 未指明命名空间的a,就使用NameSpaceA命名空间里的a
// 如果要使用NameSpaceB命名空间中的a,则仍需要使用这样的方式 NameSpaceB::a;
using NameSpaceA::a;
a = 20;                // 使用命名空间NameSpaceA中的a
NameSpaceB::a = 30;    // 使用命名空间NameSpaceB中的a
// using 声明不仅可以针对命名空间中的变量或者函数,还可以对整个命名空间进行声明
// 这样的方式声明命名空间以后,在后面使用未指定具体命名空间的变量或者函数产生命名冲突的时候
// 默认使用 NameSpaceB中的变量和函数
using namespace NameSpaceB;
a = 10;

printf ("%d\n", NameSpaceB::a);

C ++標準ライブラリとstd名前空間
C ++は、初期のC ++は完璧ではない、ない、独自のコンパイラを持っていますが、CのコードにC ++コードを変換し、その後Cコンパイラによって、名前空間をサポートしていない上のC言語をベースに開発されましたコンパイルを完了します。今回は、C ++ライブラリは、まだC言語、stdio.hの、STDLIB.H、string.hのヘッダー・ファイルを使用し、その上まだ有効であり、さらにC ++はまた、いくつかの新しいライブラリを開発したような、自分のヘッダファイルを追加しました:
iostreamの。 H:コンソール入力と出力ヘッダー。
fstream.h:ヘッダファイル操作。
complex.h:ヘッダーの複数の計算。

そして、C言語、C ++のヘッダファイルがまだの.h接尾辞、彼らはクラス、関数、マクロが含まれている、そしてそれは、スコープ内でグローバルです。

その後、C ++は、名前空間の概念を導入し、再書き込みライブラリ、クラス、関数、マクロ、およびその名前空間に統一する予定で、この名前空間名はSTDです。STDは意味標準の略語である「標準名前空間を。」

しかし、今回はC ++で開発された昔ながらのプログラムをたくさん持っている、そしてそのコードは、元のライブラリは非常に深刻な結果をもたらす変更を直接、名前空間を使用していない:プログラマは多くの時間を費やす必要はありませんでした古いコードを変更しますそして、新たな標準を使用するC ++コードに拒否し、抵抗しました。

C ++開発者は、ライブラリに少し、クラス、関数、マクロ、などこれに基づいて修正されたオリジナルのコピーを、入れて、C ++で使用し続けることができ、元のライブラリとヘッダファイルを保持するための良い方法をしたいと思います名前空間stdに基づき設立され、それは新しいC ++標準ライブラリになっています。元のライブラリを使用し続けることができ、古いC ++プログラムを使用して2つの類似のライブラリのような共存は、新たに開発されたプログラムは、C ++ライブラリの新しいバージョンを使用することができます。

重複した名前にヘッダファイルを避けるために、C ++ライブラリの新バージョンでは、指定されたファイルの先頭には接尾辞の.hを削除するように調整されたもので、古いC ++でiostream.hはiostreamのとなり、fstream.hはfstreamのとなりました。そうstdio.hのC言語はcstdioをなった、元のC言語ヘッダファイル用として、また、同じ方法を使用するだけでなく、それぞれの名前の前にCの文字を追加し、STDLIB.Hはcstdlibなりました。

、古いC ++ヘッダファイルが正式に使用するように対向していることに注意してください、それはもはや明らかでサポートされていたことが、古いCヘッダファイルは、まだCの互換性を維持するために、使用することができます。実際には、コンパイラの開発者は、顧客の既存のソフトウェアのサポートを提供止めるつもりはない、古いC ++のヘッダファイルは、まだ今後数年間でサポートされる予定期待することができます。

以下は、C ++ヘッダファイルのステータスの概要である:
彼らは公式規定するものではありませんが、1)などでiostream.h、fstream.h、など古いC ++のヘッダファイルは、引き続きサポートされます。ヘッダファイルの内容は、名前空間stdではありません。

2)このような類似のiostreamなどの新しいC ++ヘッダファイルは、基本的な機能と対応するレガシーヘッダファイルが含まれているが、名前空間stdの最初の文書の内容をFSTREAM。
注:標準化プロセスでは、ライブラリーのいくつかの部分の詳細が変更されているので、古いヘッダファイルと新しいヘッダファイルは、必ずしも正確に対応していません。
3)などstdio.hの、STDLIB.H、などの標準Cヘッダファイルがサポートされ続けます。ヘッダファイルの内容は、STDはありません。

4)Cライブラリ関数を使用して新しいC ++ヘッダファイルcstdioを、cstdlibような名前を持っています。彼らは、コンテンツを提供し、対応するCヘッダは、同じ古いファイルが、コンテンツのstd。

ヘッダファイルのための.hなしで、見つけることができ、名前空間stdに配置されているすべてのシンボルは、あなたが名前空間stdの使用宣言し、任意の名前空間を使用しなかった、バンドのための.hヘッダファイルを、すべてのシンボルがグローバル・ロールに位置していますドメイン。また、C ++規格で要求されます。

使いやすいが、大規模なプロジェクトの開発には、そうすることをお勧めされていないものののでstdが、すべての外部関数で直接宣言された関数内の競合、STDの推薦文を命名するリスクを増大させます。

2、強化実用性
C言語の変数で定義された位置は、スコープ内に開始する必要があります!
C ++言語は、あなたがそれを必要とするとき、すべての変数を再定義することができ、「実用性」をより重視です。
3、レジスタ変数変更
レジスタに格納されているローカル変数レジスタキーワード要求「コンパイラ」
C言語の変数がアドレスを登録し取得することはできませんが

C ++では、まだレジスタキーワードをサポート
1を、レジスタを使用せずに、特定の方法のために最適化されたC ++コンパイラは、最適化するために行うことが
2、C君は、アドレスレジスタ変数を取得することができ++
プログラムが見つかったアドレスレジスタ変数を取る必要があるときにC ++コンパイラ無効になる変数の宣言を登録します。
4は、変数の検出を強化し
、重複する多くのグローバル変数は、グローバル変数は、最終的に合法的なこれらの同じ名前が同じアドレス空間とグローバルデータにリンクされていますされているC言語で定義されている
C言語の中で唯一のグローバルスコープ
のすべてでC言語グローバル識別子を共有し、同じスコープ
の識別子との間の潜在的な紛争の
グローバル変数は、Cで同じ名前の複数の定義を許可していません++

図5に示すように、強化するための構造体タイプ
C言語の構造体は、集計データの集合ではなく、新しいデータ型定義
修飾の前に構造体キーワード変数の定義を追加する必要があるので、
C ++を、構造体は、新規に定義されデータ型は、直接変数を定義するために使用することができます

おすすめ

転載: blog.csdn.net/dxd_123456/article/details/77970763