define用法-linux


1.簡単なdefine定義
#define MAXTIME 1000
簡単なMAXTIMEは定義して、それは1000を代表して、もしプログラムの中で書くならば
if(i
コンパイラはこのコードを処理する前にMAXTIMEを処理して1000に置き換えます.
このような定義は通常の定数定義CONSTに似ているように見えますが、defineの定義は量として使用するのではなく、簡単なテキスト置換のように見えるため、この問題は以下に特に顕著に反映されています.
2.defineの「関数定義」
defineは関数のようにいくつかのパラメータを受け入れることができます
例1:
#define max(x,y) (x)>(y)?(x):(y);
この定義は2つの数の中で大きいものを返します.見ましたか.この「関数」にはタイプチェックがないので、関数テンプレートのようなものです.もちろん、テンプレートほど安全ではありません.簡単なテンプレートとして使えるだけです.
しかし、このようにすると隠れた危険があります.例は以下の通りです.
#define Add(a,b) a+b;
一般的に使用する場合は問題ありませんが、c*Add(a,b)*dのような場合は問題が発生します.代数式の本意はa+bでc,dに乗算しますが、define(単純な置換にすぎません)を使用しているため、式は実際には
c*a + b*d
例2:
#define pin int *;
pin a,b;
本意:aもbもint型ポインタですが、実際にはint*a,bになります.
実際:aはint型ポインタであり、bはint型変数である.
すべて:defineの代わりにtypedefを使用するべきで、aとbはint型ポインタです.
だから私たちは定義する時、良い習慣を身につけて、すべての階層に括弧をつけることをお勧めします.
例:
#include 

#define pin char *
typedef char*  pin1;

int main(void)
{
        pin a,b;// a char *  ,b char  

        printf( "%d
", sizeof(a) );//4 printf( "%d
", sizeof(b) );//1 pin1 c,d;//c,d char * printf( "%d
", sizeof(c) );//4 printf( "%d
", sizeof(d) );//4 return 0; }

3、defineの特殊な識別子
#define A(x) T_##x
#define B(x) #@x
#define C(x) #x
x=1と仮定すると、次のようになります.
A(1)------〉T_1
B(1)------〉'1'
C(1)------〉"1"
例:
#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

int a = Conn(12,34);
char b = ToChar(a);
char c[] = ToString(a);

結果はa=1234,c='a',c="1234";
##は単純なコネクタであることがわかります.#@はパラメータに単一引用符を付け、#はパラメータに二重引用符を付けて文字列に変換します.
もっと不思議なのは
例:
#define x(s) #s
char *s = x(a   b/**/ c);
char *p = x(a/nb);

結果は*s="a b c"、*p="a//nb"、#sはやっぱりすごい
3.defineの複数行定義
defineは複数行のコードに代わることができます.
例えばMFCのマクロ定義(非常に古典的で、気持ち悪いが)
#define MACRO(arg1, arg2) do {/
/* declarations */ /
stmt1;/
stmt2;/
/* ... */ /
} while(0) /* (no trailing ; ) */
重要なのは、改行ごとに「/」[注釈:テスト中にこの'/'でコンパイルできないので、''に変更して合格できる]を付けることです.
これにより,Cにおける文字列に関するいくつかのデフォルト規則が連想される.
char s1[]="abc"  "efg";
char s2[]="abc"
"efg";
char s3[]="ab\
c";
char s4[]="ab
c";

コンパイルエラーはs 4のみ発生し、s 1="
abcefg
",s2="abcefg",s3="
abc
"
4.defineの最も重要な機能は条件コンパイルです.[注釈:特にプラットフォームとシステムにまたがるソフトウェアでは]
次のようになります.
#ifdef WINDOWS
......
......
#endif
#ifdef LINUX
......
......
#endif
コンパイル時に#defineでコンパイル環境を設定できます
5.マクロの定義、マクロのキャンセル方法
//マクロの定義
#define [MacroName] [MacroValue]
//キャンセルマクロ
#undef [MacroName]
//普通マクロ
#define PI (3.1415926)
パラメータ付きマクロ
#define max(a,b) ((a)>(b)? (a),(b))
6.条件コンパイル
#ifdef XXX…(#else) … #endif
たとえば
#ifdef DV22_AUX_INPUT
#define AUX_MODE 3 
#else
#define AUY_MODE 3
#endif
#ifndef XXX … (#else) … #endif
7.ヘッダファイル(.h)は、ヘッダファイルまたはCファイルに含まれることができる.
繰り返し含む(繰り返し定義)
ヘッダファイルにネスト可能なものが含まれているため、Cファイルには同じヘッダファイルが複数回含まれる可能性があり、定義を繰り返す問題が発生する可能性があります.
条件コンパイルスイッチによる重複除外(重複定義)
たとえば
#ifndef __headerfileXXX__
#define __headerfileXXX__

//ファイル内容

#endif