#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の場合、今度は改行のエスケープになってしまいます。
どうにかして#をエスケープさせることはできるでしょうか?
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
この回答への補足
>コンパイラのオプションで切り換える。というのが一般的ではないでしょうか?
はい。普通はそうなのでしょうが、
include元のファイルから切り替えられた方が都合が良かったのです。
>さもなければ条件付きコンパイル…になるかと。
こちらですとソースが長くなってしまうので
何か方法がないものかと考えています。
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 を含めた) プリプロセッサディレクティブを入れる」ことはできないです.
この回答への補足
ためしてみました。
DIR_NAMEが#define INCLUDE_FILEで展開されず、
'DIR_NAME/aaa.h'
として文字列かされてる様子でした。
文字列の展開さえうまくいけば、
この方法で良さそうなのですが…
No.4ベストアンサー
- 回答日時:
ごめん, マクロの引数展開と文字列化との関係でマクロを 1つはさまないといけないことを忘れてた.
stringify の定義を
#define stringify(x) stringify_(x)
に変えて,
#define stringify_(x) #x
を追加したらどうだろうか.
ファイル名やディレクトリ名に空白が入るといろいろ問題になったりするが, この手法そのものがどっちかというとアレな部類に入るのでその辺は無視.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- Microsoft ASP LEDで電光掲示板に「A B C D E」と表示したいのですが・・・ 1 2023/07/04 07:37
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
defineで定数が置き換えられない?(C言語)
C言語・C++・C#
-
#defineの定数を文字列として読み込む
C言語・C++・C#
-
C言語での引数の省略方法
C言語・C++・C#
-
-
4
C++にてtemplateで受け取った任意の型の変数が何型であるかを判定したい
C言語・C++・C#
-
5
C++ 構造体の一括初期化 {0}
C言語・C++・C#
-
6
#define _CRT_SECURE_NO_WARNINGS について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
switch文のエラーについて
-
セグメンテーションフォルトが...
-
ファイル読み込みとmap処理
-
構文エラーが出ているのですが...
-
リモートデスクトップの接続元I...
-
iostream インクルード時に発生...
-
C++で縦の棒グラフ
-
snprintfが使用できない。
-
VC++で文字列から任意の文字を...
-
std::map の const 修飾について
-
このプログラミング誰か教えて...
-
vectorの中にmap
-
std::wstringのメモリリークに...
-
ヘッダーファイルがインクルー...
-
string型のフォーマット書式指...
-
winpcapを用いたプログラミング
-
C++で大量のエラーが出る
-
コンパイルできません
-
C++ basic_ostreamの拡張
-
atlbase.h と afxwin.hの同時定義
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
enumの値から定義名を文字列化...
-
switch文のエラーについて
-
空ENTERの判別
-
なぜ、C++の標準ヘッダをインク...
-
【C++】ヘッダ内でstringを格納...
-
C++での <iostream.h>と<iostre...
-
#include "fstream.h"
-
#define中の#のエスケープ
-
JPEGやPNGが読めるLoadImage関数
-
リモートデスクトップの接続元I...
-
CStringとString
-
string型のフォーマット書式指...
-
std::map の const 修飾について
-
VHDLのsignedとunsignedの違いは?
-
このプログラミング誰か教えて...
-
構造体配列のvectorへの変換と...
-
指定した文字を削除したい
-
構造体に決められた文字列を入...
おすすめ情報