プロが教える店舗&オフィスのセキュリティ対策術

#defineを使ってincludeディレクトリを切り替えようと考えました。

-------
#define DIR_NAME"DIR_A"
//#define DIR_NAME"DIR_B"

#define ALL_INCLUDE(x)\
#include x##"/aaa.h"\
#include x##"/bbb.h"

ALL_INCLUDE(DIR_NAME)

-------

ですが#includeの#記号が文字列化の演算子と判断されてしまいます。
\#includeの場合、今度は改行のエスケープになってしまいます。

どうにかして#をエスケープさせることはできるでしょうか?

A 回答 (4件)

無理.

    • good
    • 0

インクルードディレクトリを切り換えたい…というのであれば、


コンパイラのオプションで切り換える。というのが一般的ではないでしょうか?

さもなければ条件付きコンパイル…になるかと。
#defineはプリプロセッサに対する疑似命令となりますが…評価的には#include疑似命令の先に処理されるのではないかと…。


#define DIR_A_INCLUDE

#ifdef DIR_A_INCLUDE
#include "DIR_A/aaa.h"
#include "DIR_A/bbb.h"
#else
#include "DIR_B/aaa.h"
#include "DIR_B/bbb.h"
#endif

この回答への補足

>コンパイラのオプションで切り換える。というのが一般的ではないでしょうか?

はい。普通はそうなのでしょうが、
include元のファイルから切り替えられた方が都合が良かったのです。


>さもなければ条件付きコンパイル…になるかと。

こちらですとソースが長くなってしまうので
何か方法がないものかと考えています。

補足日時:2011/02/11 10:52
    • good
    • 0

最小である保証はしませんが, 以下のことなら可能でしょう:


#if INCLUDE_DIR_A
#define DIR_NAME DIR_A
#else
#define DIR_NAME DIR_B
#endif

#define stringify(x) #x
#define INCLUDE_FILE(x) stringify(DIR_NAME/x)

#include INCLUDE_FILE(aaa.h)
#include INCLUDE_FILE(bbb.h)

いずれにしても「#define の中に (#include を含めた) プリプロセッサディレクティブを入れる」ことはできないです.

この回答への補足

ためしてみました。
DIR_NAMEが#define INCLUDE_FILEで展開されず、
'DIR_NAME/aaa.h'
として文字列かされてる様子でした。

文字列の展開さえうまくいけば、
この方法で良さそうなのですが…

補足日時:2011/02/11 10:50
    • good
    • 0

ごめん, マクロの引数展開と文字列化との関係でマクロを 1つはさまないといけないことを忘れてた.


stringify の定義を
#define stringify(x) stringify_(x)
に変えて,
#define stringify_(x) #x
を追加したらどうだろうか.

ファイル名やディレクトリ名に空白が入るといろいろ問題になったりするが, この手法そのものがどっちかというとアレな部類に入るのでその辺は無視.
    • good
    • 1
この回答へのお礼

こちらの方法でうまくいきました。
どうもありがとうございました。

お礼日時:2011/02/12 11:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています