2011-11-15 6 views
1

私は連結である定数を作成したいと以下のように#を使用してみましたが、コンパイル・エラーを得た後のものはパルリー以前のもの定義した定数で#文字列を使用することはできますか?

const char* ID  = "01099BB2"; 
const char* FS_LOCATION_ROOT = "fs:/~0x"; 

で構成されているいくつかの文字列定数を持っている:

const char* FS_LOCATION = FS_LOCATION_ROOT#ID; 

この方法で文字列を組み合わせる方法はありますか?

+0

文字列化はプリプロセッサ機能です。そのようなことは実際の言語C自体にはありません。それらが真の定数であれば、プリプロセッサマクロと#defineを使うことができます... –

答えて

4

これらの文字列で何をしたいかによって異なります。ストリンジェライザのオペランド#はプリプロセッサの一部であるため、マクロ定義内に指定する必要があります。それはあなたの特定の状況のた​​めにあなたを助けるように見えません。しかし、単純な文字列リテラルが連結されるという事実を使うことができます。

"fs:/~0x" "01099BB2" is turned into "fs:/~0x01099BB2" 

ただし、変数にはリテラルのみを使用できません。私はIDという名前のマクロを定義する前に、それを2回と思うだろうが、より良いまだ

const char* FS_LOCATION = FS_LOCATION_ROOT ID 

#define ID "01099BB2" 
#define FS_LOCATION_ROOT "fs:/~0x" 

#define FS_LOCATION FS_LOCATION_ROOT ID 

か:あなたはこのような何かを行うことができます。

+0

ありがとう、私はそれらがそのように連結されることを理解できませんでした。名前IDは実際の名前ではなくここに投稿するための切り捨てられたバージョンです。 – Gruntcakes

1

シンボルとして定義されていません。あなたは同時に両方を生成することができたと思います。

#define stupid_macro(ID,ROOT) \ 
    const char *id = #ID ; \ 
    const char *root = #ROOT ; \ 
    const char *both = #ID #ROOT ; 

私は文字列化の動作を確認するためにそれをテストしませんでしたが、これで終わるはずです。

const char *id = "id_val" ; 
const char *root = "root_val" ; 
const char *both = "id_val" "root_val" ; 

最後に連結されます。これは確かに合法ですが、私はその道徳を言うことはできません。

関連する問題