必要な知識システムの知識
1.コンパイルリンク
コンパイル:CおよびC ++は1行ずつコンパイルされるため、関数を呼び出す必要がある場合、呼び出す前にコードに定義または宣言がない場合、コンパイルエラーが報告され、
リンクが見つかりません;主にスコープはファイルの内部および外部リンク属性に関連しています。これは、呼び出したときに確実に見つけられるようにするためです。コンパイルとスコープのルールによって、リンクが表示されるかどうかが決まります。が見つかり、リンク属性によって、あなたが見つかるかどうかが決まります。
2. C言語の常識
1)静的;主に同じファイルでの変更された使用を制限する(具体的には、パーツを変更する(スタックからデータセグメントにストレージフィールドを変更する)こともできる)およびグローバル(リンク属性を変更する) 、外部から内部へ)))、実際には、静的定義は1回だけ実行され
ます2)extern;グローバル変数、およびexternは、それらを定義するときに省略できます。その機能は、extern変更がからインポートされたことをリンカーに通知することです。外部にあり、他の外部を持つ必要があります。リンク属性の内部を見つけます。
3)小さなスコープが大きなスコープよりも優先されます。グローバル変数と同じ名前のローカル変数定義と同様に、ローカル定義がローカルで優先的に使用され、優先度はグローバル変数よりも高くなります。
3. C ++で名前空間を導入する
1)名前空間の役割と使用法
:グローバル変数や関数などのメンバーのリンク属性を特定の範囲内で変更および制御します。意味はパッケージングの役割であり、いくつかの一般的なリンク属性は次のとおりです。それらは一緒に名前空間を形成し、内部のメンバーを呼び出す場合は、内部のメンバーを呼び出す前にこの名前空間を呼び出す必要があります。このように、リンク属性は名前空間名を介して制御され、すべての内部メンバーのリンク属性が管理されます。
//直接根据之前的c基础和编译作用域规则推导即可
#include <iostream>
using namespace std;
namespace Ns1
{
void f1()
{
cout << "1" << endl;
}
};
//using Ns1::f1;
//using namespace Ns1;
int main()
{
//f1();//如果没有前面的声明则会报错,因为作用域问题找不到
//因为定义在前则编译的时候能够找到(要先声明否则编译报错)
//链接的时候指明Ns1则没有问题
Ns1::f1();
//f1();//在前面声明using namespace Ns1;或者声明using Ns1::f1();
return 0;
}
2)同じファイル間で名前空間の使用を定義します
。3つのポイントに注意してください。3つの使用方法は確率が異なります。
3)異なるCファイル間で名前空間を定義して使用する方法は
、他のファイルの名前空間メンバーを呼び出すときのコンパイルとリンクの問題を解決するための鍵です。したがって、ファイル間で名前空間メンバーを宣言する方法の問題が発生します。
//推导跨文件namespace要如何声明
//namespace Ns1;//报错说没有{}
//namespace Ns1{};//这个其实是再次定义了一个Ns1命名空间
namespace Ns1{
void f1();};//C中学到,声明就是把定义去掉即可,这样可以调用到,应该是namespace本身就有外部链接属性
namespace Ns1{
extern void f1();};//但是我们最好还是加上extern 表示这个函数从外部链接进来,
int main()
{
//f1();//同样先推导,直接这样些肯定找不到的,编译链接都不行
Ns1::f1();//这样可以尝试,同样报错找不到NS,那么因为在文件外,利用c中extern来声明
return 0;
}
/*
test2.cpp
#include <iostream>
using namespace std;
namespace Ns1
{
void f1()
{
cout << "1" << endl;
}
};
*/
クロスファイル宣言は1つずつ宣言する必要があることに注意してください。iostreamソースファイルが見つかりません。そうでない場合、スクリーンショットに示されているように、
iostreamソースファイルは/ usr / include / c ++の下にインストールされ、gccヘッダーファイルは/ usrの下にあります。 / include
4)デフォルトの名前空間;グローバル名前空間とも呼ばれ、通常の形式で使用できます::直接呼び出し、省略も可能であり、大きな競合よりも小さな優先順位の原則は依然として
#include <iostream>
using namespace std;
namespace Ns1
{
void f1()
{
cout << "2" << endl;
}
}
using namespace Ns1;
//这样的外部其实就是默认空间或全局命名空间
void f1()
{
cout << "1" << endl;
}
int main()
{
f1();//可以直接省略调用,但是存在冲突时就会报错,因此调用命名空间中的最好加入命名空间的名字,前缀
//::f1();//也可以用正规的调用方法
return 0;
}
4)匿名名前空間;これは主にクロスファイルに使用され、他のファイルが匿名スペースの要素を使用することを許可しません。これは、リンク属性を制限して他のファイルを作成するCのstaticと同様に、名前なしで呼び出すことができないためです。 Toを呼び出すことができないファイル
前の自慢のファイル宣言名前空間が一貫しているのと同じように、名前空間Ns1 {extern void f1();};、名前空間の名前を省略すると、宣言できず、見つかりません。
5)ネストされた名前空間。競合が発生した場合、実際には大きな優先度よりも小さな優先度が守られ、呼び出しは順番に書き込まれます。
ZhuYoupeng氏のC ++コースを紹介します。
この学習方法に注意してください。コアは、
最初のステップは問題を明確にすること、
2番目のステップは自己分析、
3番目のステップは実験的な検証です。
一般的な概要は次のとおりです。本質的に言語機能設計者と一緒に立っている自己認識システム同じ高さで言語を見て、勉強します。