学習ノート---大規模なプログラムの基礎


マルチファイル組織
コンセプト:1つの完全なプログラムが1つ以上のファイルに格納されている場合、プログラムと呼ばれるマルチファイル組織.
意味:機能が複雑な大きなプログラムを設計する際、プログラムの設計とデバッグを容易にするために、通常、プログラムをいくつかのファイルに分けて、1つのモジュールを実現するプログラムやデータを1つのファイルに置く.
外部関数の呼び出し
コードの例:
main.c:
#include <stdio.h>
#include <stdlib.h>
int max(int x,int y);// max      
int main()
{
    int a,b,c;
    printf("    :");
    scanf("%d %d",&a,&b);
    c=max(a,b);//           
    printf("max=%d
",c); return 0; }

max.c:
int max(int x,int y)
{
    int z;
    z=x>y?x:y;
    return z;
}

プログラム構造図:
結果:
解析:
1.ここでmain.cで使用するmax関数はmax.cファイルに格納されます.2つのファイルは同じプロジェクトの下にあるからです.したがって、プログラム実行時にmax.cのmax関数を識別して呼び出すことができる.正常に動作しました.
2.プログラムの実行はmain関数から始まります.main関数でmax関数を呼び出す前にmainでなければなりません.cファイルでmax関数を宣言します!
3.max関数にprintfなどのヘッダファイルが必要な関数が使用されている場合は、max.cファイルでincludeを実行してヘッダファイル宣言を行う必要があります.
外部ヘッダファイルの呼び出し
コードの例:
main.c:
/*             */
#include "head.h"//       

int main()
{
    int a;
    scanf("%d",&a);
    printf("Test Success!
a=%d",a); return 0; }

head.h:
#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED
/*       */
#include <stdio.h>
#include <stdlib.h>
/*       */
#endif // HEAD_H_INCLUDED

プログラム構造図:
結果:
解析:
1.関数宣言、グローバル変数定義、ライブラリ関数参照をパッケージ化.h形式のヘッダファイルで、必要に応じて呼び出し、コードをより簡潔にします.読みやすさの向上
2.main.cでヘッダファイルを呼び出す注意#include“head.h”は括弧ではなく二重引用符を使います!
プログラムファイルの分類:
ヘッダファイル(.h):
含む:関数宣言、グローバル変数定義、ライブラリ関数参照
ソースファイル(.c):
含む:マスターコード
コンパイラ:
コンパイル:ソースファイルをコンパイルし、ライブラリ関数ファイルに接続します(先にコンパイルし、後で接続します)
図解:
解析:
ソースファイルは先にコンパイルされる.oまたは.objファイル(接尾辞名はシステムによって変わります)
図:
次にコンパイルされる.oまたは.objファイルとライブラリ関数ファイル.lib接続、生成.exeの実行可能ファイル
図のように、プロジェクトフォルダのbinフォルダに保存されます.
静的関数と外部関数
がいぶかんすう
定義:他のファイルで呼び出せる関数
キーコード:extern
使用法:extern戻り値タイプ関数名([パラメータテーブル列])
コードの例:
main.c:
#include <stdio.h>
#include <stdlib.h>
extern int max(int x,int y);// max      , extern  max           。
int main()
{
    int a,b,c;
    printf("    :");
    scanf("%d %d",&a,&b);
    c=max(a,b);//           
    printf("max=%d
",c); return 0; }

max.c:
extern int max(int x,int y)// extern max      
{
    int z;
    z=x>y?x:y;
    return z;
}

結果:
解析:
1.関数を定義するときは、関数ヘッダの左端にexternを冠して外部関数とする.2.この関数を呼び出す必要があるファイルで、externで使用する関数が外部関数であることを宣言します.
注意1:externはデフォルトのパラメータです.関数定義時に接頭辞を付けない場合、デフォルトは外部関数であり、他のファイルで呼び出すことができます.他のファイルで外部関数の呼び出しを宣言する場合、extern接頭辞を使用しなくても、外部関数が呼び出されるのがデフォルトです.(externは省略可能)
注意2:コンパイルで外部関数が呼び出されると、コンパイラはこの関数の定義が存在すると仮定しますが、現在のファイルには存在せず、ターゲットファイルが正常に生成されます.外部関数が定義されていないため、エラーは発生しません.
注意3:接続時に、コンパイラによって得られた複数のターゲット・ファイルの関数と、名前が一意で外部関数の定義が正常であるライブラリ・ファイルに含まれる関数がチェックされます.実行可能なターゲットファイル(.exe)を生成します.接続に失敗しました.
注4:大規模なプログラムを作成するには、多くの関数を定義する必要があります.外部呼び出しが必要な関数には、コードを読むためにextern修飾をアクティブに追加する必要があります.
せいてきかんすう
定義:他のファイルで呼び出せない関数
キーコード:static
使用法:static戻り値タイプ関数名([パラメータテーブル列])
コードの例:
main.c:
#include <stdio.h>
#include <stdlib.h>
int max(int x,int y);// max      
int main()
{
    int a,b,c;
    printf("    :");
    scanf("%d %d",&a,&b);
    c=max(a,b);//           
    printf("max=%d
",c); return 0; }

max.c:
static int max(int x,int y)//  static max      
{
    int z;
    z=x>y?x:y;
    return z;
}

結果:
解析:図のように、接続タイムズが間違っていて、max関数の定義が見つかりません.
注1:大規模なプログラムを作成する場合は、大量の関数を定義する必要があります.これらの関数に重複名が表示されると、コンパイル中にエラーが発生します.一方、関数は静的として定義され、他のファイルに同じ名前の静的関数が表示されても衝突しません.
注意2:通常、同じファイルでのみ使用できる関数とグローバル変数の前にstaticを冠して局所化し、他のファイルは参照できません.
外部グローバル変数と静的グローバル変数
外部グローバル変数
キーコード:extern
ファイルとグローバル変数の範囲を拡張
コードの例:
#include <stdio.h>
#include <stdlib.h>
/*        extern           */

int max(int,int);
int main()
{
    extern int a,b;
    printf("%d
",max(a,b)); return 0; } int a=15,b=-7;// a,b int max(int x,int y) { int z; z=x>y?x:y; return z; }

結果:
解析:
main関数でグローバル変数を事前に参照宣言することで、グローバル変数の役割範囲が向上します.
他のファイルで定義されている外部変数の宣言
コードの例:
main.c:
#include <stdio.h>
#include <stdlib.h>
/*            */
extern int a,b;// extern         a,b     a,b
int max(int x,int y);
int main()
{
    printf("max=%d
",max(a,b)); return 0; }

max.c:
int a=15,b=-7;//    (  )  
extern int max(int x,int y)
{
    int z;
    z=x>y?x:y;
    return z;
}

結果:
解析:
1.extern宣言により、1つのファイルで他のファイルで定義された変数を正常に呼び出す.
2.max.cでa,bを定義するときはexternで修飾できません!
3.main.cのexternは省略できますが、コードの読みやすいように省略することはお勧めしません.
コンパイルシステムによるexternの処理
図:
注1:externの役割は、実は変数の役割範囲を拡張することであり、外部変数を宣言することは、外部変数の役割範囲を本ファイルに拡張することとも言える.
注2:外部変数はプログラムの結合性を増加させます!コードをより複雑にします!慎重に使うべきだ!
静的グローバル変数
キーコード:static
コードの例:
main.c:
#include <stdio.h>
#include <stdlib.h>
/*            */
int a=100,b=10;// extern         a,b     a,b
int max(int x,int y);
int main()
{
    printf("max=%d
",max(a,b)); return 0; }

max.c:
static int a=15,b=-7;//        
extern int max(int x,int y)
{
    int z;
    z=x>y?x:y;
    return z;
}

結果:
解析:
max.cのaの場合、bはstaticで静的グローバル変数として定義されず、mainのa、bと衝突します.
注意:静的および外部変数の詳細については、変数タイプ編を参照してください.http://blog.csdn.net/aketoshknight/article/details/53790332