【c++primer】第9章メモリモデルと名前空間

2625 ワード

一、単独コンパイル
1)関数定義または変数宣言をヘッダファイルに入れないでください.
理由:1つのヘッダファイルに1つの関数定義が含まれ、他の2つのファイル(同じプログラムに属する)にそのヘッダファイルが含まれている場合、同じプログラムに同じ関数定義が含まれます.関数がインラインでない限り、エラーが発生します.
2)ヘッダファイルに構造を入れることは可能です.変数は作成されません.
3)ヘッダファイルの書き方:「main.h」ヘッダファイルが二重引用符に含まれている場合、コンパイラはまず現在の作業ディレクトリを検索します.
                                    カッコに含めると標準ヘッダファイルがあなたを愛しているホストシステムを格納するファイルシステムで検索
4)ソースファイル:***.c#include**は必要ありません.cこれにより、繰り返し宣言が発生する
5)プリプロセッサコンパイル命令#ifndef node
                                            #define node  23
                                            #endif
二、ストレージ持続性、役割ドメインとリンク性
1)自動保存持続性(関数定義で宣言された変数)
静的ストレージ持続性(関数定義外定義変数とstatic定義変数)
動的ストレージ持続性(newオペレータが割り当てた変数はdeleteがメモリを解放するまでずっと存在します)
2)関数の役割ドメインはクラス全体、または名前空間全体のみです.関数で関数を定義できないため、ローカルではありません.
3)レジスタ変数(頻繁に使用される変数)register int i;//メモリアドレスがないため、レジスタ変数にアドレスオペレータを使用できません
4)役割ドメイン解析オペレータ":"""":
5)extern使用例
              file1.c: int count=1;
              file2.c:
#include "stdio.h"
extern int count;
int main()
{
   printf("coutnt=%d
",count); return 0; }

6)注意:externが宣言した変数は初期化できません
7)new演算子を使用して変数を初期化する文は、定数式のみを使用して静的記憶変数を初期化するため、必ず関数に配置してください.
三、レイアウトnewオペレータ
プログラマに使用する場所を指定させ、プログラマはこの特性を使用してメモリ管理規程を設定したり、特定のアドレスでアクセスする必要があるハードウェアを処理したりすることができます.
注意:レイアウトnewオペレータを使用するには、includeを追加する必要があります.
例:
#include <new>
#include <iostream>
using namespace std;
char buff[512];
int main()
{
    double *p1,*p2;
    p1=new double[5];
    p2=new (buff)double[5];
    for(int i=0;i<5;i++)
       p1[i]=p2[i]=1000+20.0*i;
    
    cout<<"p1 address:"<<p1<<"
buff address:"<<(void *)buff<<endl; cout<<"p2 address:"<<p2<<endl; return 0; }
四、ネームスペース
1)ネームスペースは、グローバルであっても、別のネームスペースであってもよい
2)using宣言usding std::cout//ローカル宣言領域に名前を追加
usingコンパイル命令using namespace std;//ネームスペースですべての名前を使用可能にする
3)例:
#include <iostream>
namespace jill{
    double  bucket(double n){return n;}
    double  fech; 
}
int main()
{
  using namespace jill;
  using std::cout;
  using std::endl;
  
  double water=bucket(2);
  fech=4;
  double fech=5;

  cout<<"water:"<<water<<endl;
  cout<<"fech:"<<fech<<endl;
  cout<<"::fech:"<<jill::fech<<endl;

}
ローカルのfechは、名前空間のfechを非表示にします.