#NAME や ##NAME のようなもの。彼らはCで何を意味しますか? マクロに関する GCC ドキュメントでそれらを見ました。
4 に答える
演算子##は、2つの引数を連結し、それらの間に空白を残しません。
#define printe(a,b) a ## b
printe(c,out) << "testing";
出力は:テスト
単一の#は、次のような文字列パラメータを使用したパラメータ置換に使用されます
#define st(x) #x
cout<<st(tesing); // equivalent to cout<<"testing";
#もプリプロセッサディレクティブです。
Cプリプロセッサを説明するウィキペディアのページから:
## 演算子は、次の例のように、2 つのトークンを 1 つのトークンに連結します。
#define DECLARE_STRUCT_TYPE(name) typedef struct name##_s name##_t
DECLARE_STRUCT_TYPE(g_object); // Outputs typedef struct g_object_s g_object_t;
#
オペレーターは、C プリプロセッサーに他のディレクティブを通知します。以下に例を示します。#include, #define, #undef, #error, #if, #ifdef, #ifndef, #else, #elif, #endif
で始まるコード ステートメント#
は、その後に続くものがプリプロセッサ ディレクティブであり、プリプロセッサによって展開される必要があることを示します。
##
トークン貼り付けまたはトークン連結マクロと呼ばれます。
「#」は実際には演算子ではなく、プリプロセッサ ディレクティブであり、「##」は関数マクロ定義にのみ使用されます。
C には多くのプリプロセッサ ディレクティブがあります。
マクロ定義には、次のものがあります。
#define
#undef
条件付き包含には、次のものがあります。
#ifdef
#ifndef
#if
#endif
#else
#elif
回線制御には、次のものがあります。
#line
エラーには、次のものがあります。
#error
ソース ファイルのインクルードには、次のものがあります。
#include
プラグマ ディレクティブには、次のものがあります。
#pragma
詳細については、http://www.cplusplus.com/doc/tutorial/preprocessor/を参照してください。