埋め込まれたC言語(II)

第二に、役割.hファイル

まず、またはC言語で任意の役割の分析.hファイルの前に呼ばれる基本的な概念を、クリアするには、プロジェクト全体が非常に大きくなると、すべての機能の機密管理の成長の実現と機能は最初、その定義や宣言を持っている必要があります必要に応じて、我々は、.hファイルに含まれている.Cファイルと関数宣言の対応する数に分割し、すべての機能の間の関係の程度の関数なります。
<XXX.h>の#includeファイルの内容を使用してライブラリを呼び出して
使用する#include「XXX.h」に独自のライブラリを定義し
、次のように特定の.hファイル
_ #ifndefのXXX_H // _いない場合はDEFINE XXX_Hを、次のようにコンパイルし、その後、 #endifの知っている、無効XXX()関数次の文の重複を防止するために行われる
_の#defineをXXX_Hは、
他のヘッダファイル含むことができ
、マクロ定義と定義された他の定数
のボイドXXXを(); //関数宣言
の#endif

#include xxx.hは、実際にこの.Cファイルにおいて、特定XXX()関数を達成するためにxxx.cファイルに、現在の場所にxxx.hに事前コピーコンテンツにコンパイラに指示します私はあなたがモジュラー方法の.Hを使用することができ、長いヘッダー・ファイル内のステートメントの#include「xXX.h」などとして、XXX()関数を使用するために、他の文書で、この後、の#include「xXX.h」を宣言する必要がありますこのプログラムは、だけでなく、コードがより合理化することができます

第三に、関数ポインタ、およびコールバック

1.関数名、関数ポインタと関数ポインタ

関数ポインタ:関数へのポインタは、対処するためのエントリポイントの機能
の異なる治療の関数として、データの変更に応じて呼び出すことができる関数ポインタを使用することの利点は、一般的に、コールバック関数、他のアプリケーションでの割り込みベクタテーブルで使用されます。次のように一般的な使用方法は

int ( * pfun) (int,int);			//定义一个函数指针pfun
pfun=&max;							//或pfun=max;两种方法都可行,都是把函数指针指向函数入口地址
pfun(1,2);							//或(*pfun)(1,2);两种方法都可行,都是通过函数入口地址调用函数

関係のタイプpfun最大のintとint型と同様の関係*:使用状況pfun =&maxとエラーが発生していない上に、それは気持ちがある私を与えました。しかし、pfun =最大使用しているとき、あるかのように私たちの感覚を与えることによって、コンパイルを関数名が定数関数ポインタでそれを説明する方法ですか、?

  1. 実際には、最大pfunの関数ポインタと関数名は、関数ポインタであること、同じです。最大関数名は定数関数ポインタ、彼らの関係で数とpfunポインタ変数の関数です。
  2. (* pfun)(10)のように関数名を呼び出す必要があった場合でも、そう、読み書きするのに便利とするために使用されていないではありません。C言語の設計者はそうでなく、pfun(10)を許可するように設計されます。このフォームコール(と数学のそんなに、より便利で機能的な形、のような、そうではありませんか?)。
  3. 一貫性のために、pfun関数ポインタ変数もpfun体(10)を呼び出すことができます。
  4. 割り当ては、最大= pfunあり、pfunを形成=&マックス。
    上記のコードの文言は、あなたがどれだけ愛して!
    患者のより良い理解への関数ポインタは、*楽しい(ボイド)intとして、int型のポインタにこの定義関数funの戻り値の型を、私たちは楽しいが関数ポインタであると言います。

2、コールバック関数

いわゆるコールバック関数は、関数ポインタによる関数呼び出しです。関数ポインタを渡す呼び出されたときに、別の関数に渡される関数のエントリ・アドレスへのパラメータとして関数ポインタを関数として参照している場合、関数は、コールバック関数と呼ばれています。
コールバック関数の利点は、呼び出し元と呼び出し先が唯一のように、A機能の種類があります知っている必要があり、特定の関数呼び出しを気にすることなく、発信者を分離することです。ケース

void caller(void (* ptr)())
{
	ptr();
}
void fun1();
void fun2();
int main ()
{
	void (* p)();
	p=fun1;
	caller(p);										//调用函数caller不会关心P所指向的函数的具体功能,当P指向的函数地址发生改变,
	p=fun2;											//caller内部就会调用不同函数进行处理
	caller(p);
}

第四に、使用アサーションの安全性試験

アサーションは、成熟組込みソフトウェア・エンジニアは、多くの場合、プログラムはデバッグを容易にするため、デバッグバージョンとリリースバージョンに分かれているだけでなく、安定したバージョンは、いつでも使用することができます保証するために、実際にはマクロです。ASSERTのみデバッグバージョンでのマクロ作品、それがエラー状態を返した場合、それはプログラムの実行を停止し、その役割にプロトタイプassert.hで定義されています。ケース

#include <assert.h>
void assert( int expression );

役割ASSERTそれが偽(で、0)であれば、それはXianxiangはエラーメッセージを出力した後、アボート呼び出すことにより、プログラムを終了STDERR、計算式expressionにあります。

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
int main( void )
{
       FILE *fp;
    
       fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件
       assert( fp );                           //其作用是如果fp为空,则终止程序执行
       fclose( fp );
    
       fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败
       assert( fp );                           //其作用是如果fp为空,则终止程序执行
       fclose( fp );                           
       return 0;
}

推奨しないのassertは()の理由は、頻繁に呼び出し、追加のオーバーヘッドのプログラムのパフォーマンスに大きな影響。試運転の後、無効にアサートコールに声明の#define NDEBUGあっする#include <assert.h>の前に挿入することで、次のサンプルコード:

#include <stdio.h>
#define NDEBUG
#include <assert.h>
公開された26元の記事 ウォンの賞賛6 ビュー3764

おすすめ

転載: blog.csdn.net/bojin4564/article/details/105358172