C言語での「##」の使い方

1881 ワード

数年前にオープンソースプログラムuCGUI(後にemWinにアップグレードしてオープンソースにしない)の下位コードを見たとき、いくつかのマクロ定義に##記号が入っているのを見たことがありますが、当時は不明なので、今思えばブラインドスキャンする必要があります.資料を探すことで、以下にまとめます.
#マクロパラメータを文字列に変更
##2つのマクロパラメータを貼り合わせる
#define STR(s)     #s
#define CONS(a,b)  int(a##e##b)
int main()
{
   printf(STR(vck));           //      "vck"
   printf("%d
", CONS(2,3)); // 2e3 :2000 return 0; }

マクロパラメータが別のマクロである場合、マクロ定義に「#」または「###」が使用される場所ではマクロパラメータは展開されないことに注意してください.
#define A          2
#define STR(s)     #s
#define CONS(a,b)  int(a##e##b)
printf("int max: %s
", STR(INT_MAX)); // “INT_MAX” printf("%s
", CONS(A, A)); // int(AeA),

ただし、INT_MAXもAも展開されず、この問題を解決するには1層の中間変換マクロを追加し、中間変換マクロですべてのマクロのパラメータをすべて展開する.
#define A           (2)
#define _STR(s)     #s
#define STR(s)      _STR(s)          //    
#define _CONS(a,b)  int(a##e##b)
#define CONS(a,b)   _CONS(a,b)       //    

コード参照:https://blog.csdn.net/baidu_33850454/article/details/79363033
実際の応用を見ると、
#define STRUCT(type) typedef struct _tag_##type type;\
                     struct _tag_##type

STRUCT(Student)
{
char * name;
int id;
};

//   STRUCT(Student)      :

typedef struct _tag_Student Student;

struct _tag_Student
{
char * name;
int id;
};

まとめ:##コネクタを合理的に利用して、例えば機能が似ている関数、変数を統一して命名することができて、プログラムを更に簡潔にすることができて、可読性を高めることができます.
PS:uCGUIは小型の埋め込み式GUIで、バージョンが更新された後にemWinと呼ばれて、それらはすべて単片機の上で運行することができて、前者のコントロールの風格はXPと似ていて、典型的な工業制御のインターフェース、後者の風格はWIN 7に近くて、コントロールは皮膚のレンダリングを開くことができて、比較的にきれいです.uCGUIはオープンソースで、uCGUIのソースコードを研究することによって自分のスタイルのコントロールをDIYすることができて、コントロールの機能を拡張して、uCGUIは自分のメモリの分配、使用、解放とごみの回収のメカニズムがあって、メッセージの駆動のメカニズムなど、また比較的に大きいのは自分のプログラミングの能力を高めることができます.
私が使っているのはSTemWin 5です.22(STemWinはemWinのSTカスタマイズ版)で、多くの心得があり、後で使用経験を書く暇があります.