私は2つの文字列値を取り、それらの間に1つのスペースを連結して返すと想定されるマクロを定義しようとしています。スペース以外に好きな文字を使用できるようです、例えば:
#define conc(str1,str2) #str1 ## #str2
#define space_conc(str1,str2) conc(str1,-) ## #str2
space_conc(idan,oop);
space_conc
は "idan-oop"を返します
「idan oop」を返す何かが欲しい、提案?
これを試して
_#define space_conc(str1,str2) #str1 " " #str2
_
「##」は、文字列ではなく記号を連結するために使用されます。文字列は単にCで並置することができ、コンパイラはそれらを連結します。これがこのマクロが行うことです。最初にstr1とstr2を文字列に変換し(これをspace_conc(hello, world)
のように使用する場合は、 "hello"と "world"としましょう)、単純な単一スペースの文字列を挟んでそれらを隣同士に配置します。つまり、結果の展開は、コンパイラーによって次のように解釈されます。
_"hello" " " "world"
_
それを連結します
_"hello world"
_
HTH
編集する
完全にするために、マクロ展開の「##」演算子は次のように使用されます。
_#define dumb_macro(a,b) a ## b
_
dumb_macro(hello, world)
として呼び出されると、次のようになります。
_helloworld
_
これは文字列ではなくシンボルです。最初に定義しない限り、「helloworld」は存在しないという未定義のシンボルエラーが発生する可能性があります。これは合法です:
_int helloworld;
dumb_macro(hello, world) = 3;
printf ("helloworld = %d\n", helloworld); // <-- would print 'helloworld = 3'
_
#define space_conc(str1, str2) #str1 " " #str2
printf("%s", space_conc(hello, you)); // Will print "hello you"
正しいのは、2つの弦を隣り合わせに配置することです。 「##」は機能しません。ただ:
#define concatenatedstring string1 string2