• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:#define中の#のエスケープ)

#define中の#のエスケープ方法とは?

このQ&Aのポイント
  • C言語の#defineディレクティブ内で#をエスケープする方法について調査しました。
  • includeディレクトリを切り替えるために#defineディレクティブを使用する際に、#をエスケープさせる方法を知りたいです。
  • includeディレクトリの指定に#defineを使う場合、#が文字列化の演算子として解釈されてしまうため、#をエスケープする方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

ごめん, マクロの引数展開と文字列化との関係でマクロを 1つはさまないといけないことを忘れてた. stringify の定義を #define stringify(x) stringify_(x) に変えて, #define stringify_(x) #x を追加したらどうだろうか. ファイル名やディレクトリ名に空白が入るといろいろ問題になったりするが, この手法そのものがどっちかというとアレな部類に入るのでその辺は無視.

emuesuenu
質問者

お礼

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

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

最小である保証はしませんが, 以下のことなら可能でしょう: #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 を含めた) プリプロセッサディレクティブを入れる」ことはできないです.

emuesuenu
質問者

補足

ためしてみました。 DIR_NAMEが#define INCLUDE_FILEで展開されず、 'DIR_NAME/aaa.h' として文字列かされてる様子でした。 文字列の展開さえうまくいけば、 この方法で良さそうなのですが…

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

インクルードディレクトリを切り換えたい…というのであれば、 コンパイラのオプションで切り換える。というのが一般的ではないでしょうか? さもなければ条件付きコンパイル…になるかと。 #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

emuesuenu
質問者

補足

>コンパイラのオプションで切り換える。というのが一般的ではないでしょうか? はい。普通はそうなのでしょうが、 include元のファイルから切り替えられた方が都合が良かったのです。 >さもなければ条件付きコンパイル…になるかと。 こちらですとソースが長くなってしまうので 何か方法がないものかと考えています。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

無理.

関連するQ&A