1、#定義
単純な置換のため、コンパイル時にいずれかのチェックを行わずに前処理コマンドを定義
マクロの一般的な形態は次のように定義されます。
#define 宏名 字符串
ここでは、文字列は、一般的な意味ではなく、文字列のC言語の等価な文字のシーケンスであり、それは二重引用符を必要としないのです。
2、のtypedef
単純な宣言はそれ自体が自動、EXTERN、変更可能な、静的、登録及び他のキーワードと同じ式で表示されていない、鍵記憶クラスであるC言語でエイリアス錯体を規定としてのtypedefが使用されます。
エイリアスのtypedef一般的な形式は次のとおりです。
typedef 旧名字 新名字
図3に示すように、差とのtypedefを定義します
セミコロン(1)の#define、セミコロンの後のtypedefテープの後なし。
(2)の#define指定子は、拡張マクロ型名の他のタイプを使用することができる、などのtypedefありません。以下のような:
#define INT1 int
unsigned INT1 n; //没问题
typedef int INT2;
unsigned INT2 n; //有问题
INT1符号なしの型指定を拡張することができますが、署名のない拡張INT2を使用することはできません。
連続的ないくつかの変数を定義する場合(3)、typedefのすべての変数が同じタイプを定義している、との#defineが保証されないことを保証します。以下のような:
#define PINT1 int*;
P_INT1 p1,p2; //即int *p1,p2;
typedet int* PINT2;
P_INT2 p1,p2; //p1、p2 类型相同
P1および成形を指すようにP1、P2、すなわちポインタ変数定義PINT1異なるタイプは、P2を成形する変数である。PINT2、すなわち、すべての点int型のポインタを同じタイプのP1およびP2を定義しました。
typedefに関する重要な問題を見てみましょう!!コードを見てください:
#include <stdio.h>
typedef char *pStr;
int main(void)
{
char string[4]="abc"; //第一行代码
const char *p1=string; //第二行代码
const pStr p2 = string; //第三行代码
p1++; //第四行代码
p2++; //第五行代码
return 0;
}
このコードコンパイラはエラーを報告します:error: increment of read-only variable 'p2'
あなたは、問題が何であるかを知っていますか?
その答えと分析:
コードp2の5行目++間違っているのです。この質問は、私たちに思い出させる:異なるのtypedefとの#defineが、それは単純なテキストの置き換えではありません。上記のコードCONSTのpStr P2が等しいCONSTするchar * P2はありません。P2とのpStrのconstのp2の本質的な違いには何のconstのpStr、すべての変数は読み取り専用に制限はありませんが、ここでは変数p2のデータ型は、システムに内在する当社独自の定義ではなく、それを入力します。
したがって、CONSTのpStr P2は意味である:CHARデータ型として定義された変数P2の読み取り専用である、すなわち、チャー CONST P2は、P2がしばしばタイプCHARポインタを示すポインタであるが、P2は、P2そう++エラー、修正することができません。
道とのconst文の意味のいくつかの例:
const int a; //①
int const b; //②
const int *c; //③
int * const d; //④
int const * e const; //⑤
①aは不変、一定です。
②bは不変、一定です。
③c整数定数はポインタであり、ポインタを変更することができ、ポインタの内容を変更することはできません。
④d定数ポインタは、整数変数へのポインタは、ポインタを変更することはできず、コンテンツポインタを変更することが可能です。
⑤eポインタは、整数定数へのポインタが一定であり、ポインタ変数の内容へのポインタではありません。
私の個人的なブログ:https://zhengnianli.github.io/
私のマイクロチャネル公共数:組み込みごった煮