C言語のファイルが含まれています.

11945 ワード

http://bbs.61job.cn/space/viewspacepost.aspx?postid=2187&spaceid=7
多くの人はC言語の中の「ファイルを含む」ことに慣れなくなりました.ファイルはプログラム開発の中に含まれています.私達のモジュール設計に大きなメリットをもたらします.ファイルに含まれている方法を通じて、プログラムの中の各機能モジュールを結び付けるのはモジュール設計の中の一つの非常に有利な手段です.
       ファイル包含処理とは、あるソースファイルにおいて、ファイル包含コマンドによって他のソースファイルの内容をすべてこのファイルに含めることです.ソースファイルをコンパイルするときは、組み込まれたファイルとともにコンパイルし、ターゲットファイルを生成します.
    多くの人が初心者の時にはこれに目眩がしますが、どうやって書類を書きますか?どのように含めると再定義を避けることができますか?などの問題があります.
 
    実はこれはファイルに含まれている基本的な処理方法を理解すれば、ファイルに対して良い理解と応用が含まれています.
 
  ファイルに含まれる処理方法:
   まず、みんながはっきりしている必要があります.
  (1)処理時間:ファイルも含まれていますが、「〓」の書き出しで書かれています.それはプリプロセッサに送るものです.つまり、ファイルはプリプロセッサを含めてコンパイル前処理段階で処理されます.
  (2)処理方法:前処理段階において、システムが自動的に葑includeコマンドを処理し、具体的には、ファイルを含む内容を下にして、文(Üinclude)を含むところにコピーして、新しいファイルを入手してから、この新しいファイルをコンパイルするというやり方です.
 
  この二つの点をつかんでください.これは難しいものではないです.
  一般的にファイルは2種類に分けられます.含む.hファイルと含む.cファイル
1.もちろんこの二つの場合も上記の方法で処理します.へへ,これはきっと言うべきことがないのです.
2.含む.cファイルとコンパイルマルチファイルプログラムは違います.   マルチファイルプログラム:ソースファイルのコンパイル時に複数のファイルをコンパイルし、接続して実行可能ファイルを作成します.   含んでいます.cファイル:上の法則によって、複数のファイルを一つのファイルに統合してコンパイルします.
次に例を見てみます.(1)は.cファイルを含みます.
 
    
1: //file1: main.c
 
    
2: #include
 
    
3: #include "fun.c"
 
    
4: int main()
 
    
5: {
 
    
6: int a=5,b=19;
 
    
7: c = a;
 
    
8: sun(a,b);
 
    
9: printf( "c=%d/n",c);
 
    
10: return 0;
 
    
11: }
 
    
12: //end of file1
   1: //file2: fun.c
   2: int c=0;
   3: void sun(int a, int b)
   4: {
   5:     printf("a+b=%d/n",a+b);
   6:     c=0;
   7:     printf("c=%d/n",c);
   8: }
   9: //end of file2   
  10:   
この例は.cファイルを含む方法で実現した.
 
コンパイルする時に、直接にmail.cファイルをコンパイルして、プリプロセッサはfun.cファイルの中の内容をmail.cにコピーしてから、新しいmail.cをコンパイルします.
コンパイルコマンド:
    gcc mail.c-o main
ここではfun.cをコンパイルしていませんが、最終的なmain実行プログラムが生成されました.
前処理の結果をコマンドで観察することもできます.
コンパイルコマンド:   gcc-E mail.c-o mail.cppはmail.cppファイルの末尾に次のコードが見られます.
   1: //main.cpp   
   2: 931 # 2 "main.c" 2
   3: 932 # 1 "fun.c" 1
   4: 933 //     fun.c     
   5: 934 int c=0;
   6: 935 void sun(int a, int b)
   7: 936 {
   8: 937  printf("a+b=%d/n",a+b);
   9: 938  c=0;
  10: 939  printf("c=%d/n",c);
  11: 940 } 
  12:     //   main  
  13: 941 # 3 "main.c" 2
  14: 942 int main()
  15: 943 { 
  16: 944  int a=5,b=19;
  17: 945  c = a;
  18: 946  printf("c=%d/n",c);
  19: 947  sun(a,b);
  20: 948  printf("c=%d/n",c);
  21: 949  return 0;
  22: 950 }
表示されるのは、実際にはfun.cファイルの内容をmain関数に追加する前に、新しいファイルをコンパイルして、最終的に実行可能なプログラムを生成します.
 
(2)マルチファイルプログラムをコンパイルする:
上記の例と同様に、main.cnの「啱include」の注釈を落とし、「extern int c」という文を加えます.c変数は別のファイル(fun.c)で定義されています.
   1: //file1:  main.c 
   2: #include 
   3: //#include "fun.c"  //   
   4: extern int c;        //     
   5: int main()
   6: {
   7:     int a=5,b=19;
   8:     c = a;    
   9:     sun(a,b);
  10:     printf("c=%d/n",c);
  11:     return 0;
  12: }
  13: //end of file1
  14:  
  15:  
  16: //file2: fun.c
  17: int c=0;
  18: void sun(int a, int b)
  19: {
  20:     printf("a+b=%d/n",a+b);
  21:     c=0;
  22:     printf("c=%d/n",c);
  23: }
  24: //end of file2  
 
今回も上記の方法でmail.cだけコンパイルするとエラーが発生します.変数cと関数sunはmail.cで定義されていませんので、コンパイルする時はfun.cを一緒にコンパイルする必要があります.
コンパイルコマンド:   
    gcc-c mail.c-o mail.o                 #メーン.    gcc-c fun.c-o fun.o                       #コンパイルfun.    gcc mail.o fun.o-o main              #mail.o fun.oでmainを生成します.
       ここに来て皆さんはすでに理解しています.cファイルとマルチファイルプログラムの本質的な違いがあります.
はい、この二つの方法の長所と短所を考えてみてください.ここでは足りないところだけを書きます.
1.含まれています.cファイルの方法:「再定義」が発生しやすいです.一つのプロジェクトの中に複数のファイルが同時に一つのファイルを含んでいると、これが含まれているファイルの内容は複数のファイルにコピーされます.つまり、そのファイルを含むファイルごとに、ファイルに含まれる変数と関数を定義することに相当します.リンクするときに「再定義」が発生します.エラー
2.複数のファイルを別々にコンパイルする方法:これがいいです.「再定義」などの問題が発生しにくいです.これも私達が最もよく使う方法です.しかし、上記の例のように直接使うのではなく、「ヘッダファイル」を使ってそれぞれのファイルをリンクします.
     上記の例では、main.cnに「extern int c」という文が必要であることが分かります.もし含まれている書類が多いならば?グローバル変数が多いなら?これを省きますか?答えは肯定です.方法は頭文字を書いてあげることです.
 
       次に、ヘッダファイルを使ってこの例を実現する方法を見ます.
1:
//file 1:mail.c
2:萼include
3:萼include
「fun.h」
//fun.cをfun.hに修正
4:
//extern int c;//これでいいです.いらないです
5:
int main()
6:{
7:
int a=5,b=19
8:c=a
9:sun(a,b)
10:printf(
“c=%d/n”,c)
11:
return 0;
12:}
13:/end of file 1
 
1: 
2:
//file 2:fun.c
3:萼include
「fun.h」
4:
int c=0
//変数cの定義
5:
void sun(
int a
int b)
//関数sun()の定義
6:{
7:printf(
a+b=%d/n、a+b)
8:c=0
9:printf(
“c=%d/n”,c)
10:}
11:
//end of file 2
 
1:
//file 3:fun.h
2:
extern
int c;
//cを外部で利用可能なものとして宣言する
3:
void sun(
int a
int b)
//sun()関数の宣言
4:
//end of file 3
このようにもう一度見てください.fun.cで定義されている関数や変数を使うファイルにfun.hファイルが含まれていればいいですか?ふふ、もちろんです.
前処理はfun.hの内容をファイルにコピーしますが、コピーした内容は名声だけです.定義ではないので、コピーしても再定義はありません.
ほほほ、はい、このようにして、これは頭のファイルが私達に更に来る利益をあげます.
 
前に述べたように、ヘッダファイルの方法もモジュール設計の中の非常に有利な手段です.
        同じ種類の機能を一つに書いてください.cファイルの中で、彼らを一つのモジュールに分けて、また対応するものを一つ書きます.hファイルをその声明にします.これからこのモジュールを使う時は、この二つのファイルをプロジェクトに追加するだけで、モジュール内の関数や変数を使用するファイルに含まれます.hファイルでいいです.
         
        実際的な例を挙げると、マクロプロセッサ、ARMまたは他の組み込み開発において、各プラットフォーム自体は様々なハードウェアモジュールがあるかもしれません.使う時には、それぞれのドライバを書く必要があります.このようにして、各ハードウェアモジュールのドライバをモジュールとして使用することができます.(例えば、lcdドライバはlcd.c.c.c.c.c.c.とlcd.hに対応します.IICドライバはI.c.c.c.c.c.c.c.c.c.c.c.c.c.c特定のモジュールに具体的に使用する場合は、対応する.cと.hファイルをプロジェクトに追加し、ファイルにペアを含めるだけでよい.
 
ですから、頭の文書の書き方については個人的です.
以下の点をまとめます
(1)対応する.cファイルに変数、関数の定義(2)に対応する.hファイルに変数、関数の宣言(3)データタイプの定義とマクロ定義があれば、書いてください.ヘッダファイル(.h)に(4)ヘッダファイルに必ず(.)ファイルを追加します.
 
ほほほ、OK、これらについて、書いたのは少し乱れていて、みんなに対して助けがあることを望みます.