web-dev-qa-db-ja.com

Cで2つの文字列を連結するためのマクロ

私は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」を返す何かが欲しい、提案?

21
Idan

これを試して

_#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'
_
48
falstro
#define space_conc(str1, str2) #str1 " " #str2
printf("%s", space_conc(hello, you)); // Will print "hello you"
5
Thomas Bonini

正しいのは、2つの弦を隣り合わせに配置することです。 「##」は機能しません。ただ:

#define concatenatedstring string1 string2
1