- ベストアンサー
#define中の#のエスケープ方法とは?
- C言語の#defineディレクティブ内で#をエスケープする方法について調査しました。
- includeディレクトリを切り替えるために#defineディレクティブを使用する際に、#をエスケープさせる方法を知りたいです。
- includeディレクトリの指定に#defineを使う場合、#が文字列化の演算子として解釈されてしまうため、#をエスケープする方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ごめん, マクロの引数展開と文字列化との関係でマクロを 1つはさまないといけないことを忘れてた. stringify の定義を #define stringify(x) stringify_(x) に変えて, #define stringify_(x) #x を追加したらどうだろうか. ファイル名やディレクトリ名に空白が入るといろいろ問題になったりするが, この手法そのものがどっちかというとアレな部類に入るのでその辺は無視.
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
最小である保証はしませんが, 以下のことなら可能でしょう: #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' として文字列かされてる様子でした。 文字列の展開さえうまくいけば、 この方法で良さそうなのですが…
- Wr5
- ベストアンサー率53% (2173/4061)
インクルードディレクトリを切り換えたい…というのであれば、 コンパイラのオプションで切り換える。というのが一般的ではないでしょうか? さもなければ条件付きコンパイル…になるかと。 #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元のファイルから切り替えられた方が都合が良かったのです。 >さもなければ条件付きコンパイル…になるかと。 こちらですとソースが長くなってしまうので 何か方法がないものかと考えています。
- Tacosan
- ベストアンサー率23% (3656/15482)
無理.
お礼
こちらの方法でうまくいきました。 どうもありがとうございました。