質問

私はそうとしていることをどのようなバブ思考えです。もう少し前向きなことをやりたいこのように:

#error BOOST_VERSION

が、プリプロセッサに膨らまないBOOST_VERSION.

思いがこのイベント内容を印刷する実行時プログラムからの、思いが、出力のプリプロセッサを見たと言えるのでしょうか。感じるようにないということが時に作成できます。

役に立ちましたか?

解決

あなたはVisual C ++を使用している場合は、#pragma messageを使用することができます:

#include <boost/preprocessor/stringize.hpp>
#pragma message("BOOST_VERSION=" BOOST_PP_STRINGIZE(BOOST_VERSION))

編集のリンクのためのLBのおかげで、

は明らかに、GCC当量(試験せず)である

#pragma message "BOOST_VERSION=" BOOST_PP_STRINGIZE(BOOST_VERSION)

他のヒント

BOOST_PP_STRINGIZE のように見えるソリューションのためのC++のものではないが、通常C.

こちらは自溶液のためのGNU CPP:

/* Some test definition here */
#define DEFINED_BUT_NO_VALUE
#define DEFINED_INT 3
#define DEFINED_STR "ABC"

/* definition to expand macro then apply to pragma message */
#define VALUE_TO_STRING(x) #x
#define VALUE(x) VALUE_TO_STRING(x)
#define VAR_NAME_VALUE(var) #var "="  VALUE(var)

/* Some example here */
#pragma message(VAR_NAME_VALUE(NOT_DEFINED))
#pragma message(VAR_NAME_VALUE(DEFINED_BUT_NO_VALUE))
#pragma message(VAR_NAME_VALUE(DEFINED_INT))
#pragma message(VAR_NAME_VALUE(DEFINED_STR))

上記定義の結果:

test.c:10:9: note: #pragma message: NOT_DEFINED=NOT_DEFINED
test.c:11:9: note: #pragma message: DEFINED_BUT_NO_VALUE=
test.c:12:9: note: #pragma message: DEFINED_INT=3
test.c:13:9: note: #pragma message: DEFINED_STR="ABC"

のための "と定義されinterger", "として定義文字列", は、 "定義されているもののない価値" 変数を作っていくというだけです。のみ "定義されていない" 変数は、表示と同じで独自の変数の名前です。いまで使用されてい--というか誰かが提供できるより良い解決策です。

知っていることは長い時間後に元のクエリーが、この場合にも役立ちます。

することができGCCを使用stringifyオペレーター"#"が必要である。

#define XSTR(x) STR(x)
#define STR(x) #x

の値をマクロで表示され:

#pragma message "The value of ABC: " XSTR(ABC)

参照:3.4Stringificationのgccのオンライン書です。

どのような著作物:

プリプロセッサーを理解し引用文字列て取り扱う異なるからです。文字列の連結がその例です.メッセージpragmaが必要であるというのが論は引用文字列になります。がある場合の成分を一つ以上の引数をもって調べることができ文字列をその文字列の連結を適用することができます。プリプロセッサーになると、非公開の文字列を使うこともありますが、すべてすべて引用符で囲まれるかった場合とします。

#define ABC 123
int n = ABC;

いないコンパイル。

を検討してください。:

#define ABC abc
#pragma message "The value of ABC is: " ABC

に相当する

#pragma message "The value of ABC is: " abc

この原因は、プリプロセッサの警告ではabc(非公開できません連結される前の文字列になります。

現在のプリプロセッサstringize(と呼ばれていたstringificationのリンクを含めてんの人気予測を算出するのに使用、改正用しています。(共に、なおもdetestable.の期間はもちろん、stringifaction.準備を更新するリンクになります。)) オペレーターこの為だけに、引数のマクロおよび置換しunexpanded引数の引数をダブルクォートで囲まれ.このように:

#define STR(x) #x
char *s1 = "abc";
char *s2 = STR(abc);

割り当てま同一の値にs1とs2.ごgcc-Eでの出力に出力します。もSTRの方がよいの名のようなものENQUOTE.

この問題を解決して引用符の周りに非公開項目では、現在の問題は、そうでない場合は、引数を現在のマクロ、マクロ的な拡大しました。このマクロが必要です。XSTRの拡大および引数の呼び出STRを入れる拡張値になります

私の知る限りは、「#エラー」を知っているだけの文字列を出力しますが、実際にあなたドン「でも、引用符を使用する必要がありtはします。

あなたは「BOOST_VERSION」を使用して、さまざまな意図不正なコードを書いてみましたか?おそらく、何か "何とか[BOOST_VERSION] = FOO;" のようなあなたの「1.2.1文字列リテラルは配列のアドレスとして使用することはできません」のようなものを教えてくれます。それはかなりのエラーメッセージではありませんが、少なくとも、それはあなたに関連する値を表示します。あなたはあなたの価値を教えてくれないコンパイルエラーを見つけるまで、あなたの周りに再生することができます。

な向上:

  1. の定義と同じマクロを再度コンパイラの人のまちでの警告が表示されます。

  2. からご覧の場所は、前定義で設定します。

  3. viファイルの定義で設定します。

ambarish@axiom:~/cpp$ g++ shiftOper.cpp
shiftOper.cpp:7:1: warning: "LINUX_VERSION_CODE" redefined
shiftOper.cpp:6:1: warning: this is the location of the previous definition

#define LINUX_VERSION_CODE 265216
#define LINUX_VERSION_CODE 666

int main ()
{

}
#define a <::BOOST_VERSION>
#include a
MSVC2015:致命的なエラー C1083:うまくいかないインクルードファイル:'::106200':なファイルまたはディレクトリ

られているもの preprocess to file が有効な場合でも、無効なトークンに存在す:

#define a <::'*/`#>
#include a
MSVC2015:致命的なエラー C1083:うまくいかないインクルードファイル:'::'*/`#':なファイルまたはディレクトリ
GCC4.x:警告:欠終了'キャラクター"-Winvalid-pp-トークン]
#define a <::'*/`#>

でのMicrosoft C / C ++、あなたは組み込み定数を印刷する_CRT_STRINGIZE()を使用することができます。私stdafx.hファイルの多くは、これらのいくつかの組み合わせが含まれています:

#pragma message("_MSC_VER      is " _CRT_STRINGIZE(_MSC_VER))
#pragma message("_MFC_VER      is " _CRT_STRINGIZE(_MFC_VER))
#pragma message("_ATL_VER      is " _CRT_STRINGIZE(_ATL_VER))
#pragma message("WINVER        is " _CRT_STRINGIZE(WINVER))
#pragma message("_WIN32_WINNT  is " _CRT_STRINGIZE(_WIN32_WINNT))
#pragma message("_WIN32_IE     is " _CRT_STRINGIZE(_WIN32_IE))
#pragma message("NTDDI_VERSION is " _CRT_STRINGIZE(NTDDI_VERSION)) 

このような出力何かます:

_MSC_VER      is 1915
_MFC_VER      is 0x0E00
_ATL_VER      is 0x0E00
WINVER        is 0x0600
_WIN32_WINNT  is 0x0600
_WIN32_IE     is 0x0700
NTDDI_VERSION is 0x06000000

また、ソースファイルを前処理すると、どのようなプリプロセッサ値評価さに見ることができます。

あなたが探している

#if BOOST_VERSION != "1.2"
#error "Bad version"
#endif

未偉大BOOST_VERSIONは、私が想定しているよう、文字列ですが、また、メジャー、マイナーリビジョン番号に対して定義された個々の整数があるかもしれません。

もし

プリプロセッサの出力を見ると、あなたが求める答えに近いものです。

私は、あなたがそれを除外(および他の方法)しましたけど、私は確かに理由はありませんよ。あなたは解決するために、特定の十分な問題を抱えているが、あなたは「通常」のいずれかの方法があなたのためにうまく機能しない理由を説明していない。

あなたはBOOST_VERSIONとコンパイルを出力するプログラムを作成し、ビルドシステムの一部として、それを実行することができます。そうでなければ、私はあなたが運の尽きだと思う。

BOOST_VERSIONブーストヘッダファイルversion.hppに定義されます。

の向上の文書などについてをご利用のマクロ:

参照 BOOST_VERSION, から http://www.boost.org/doc/libs/1_37_0/libs/config/doc/html/boost_config/boost_macro_reference.html#boost_config.boost_macro_reference.boost_helper_macros:

のboostのバージョン XXYYZZの書式: (BOOST_VERSION % 100) のサブナ 版 ((BOOST_VERSION / 100) % 1000) マイナーチェンジ-バージョン (BOOST_VERSION / 100000) の主要な バージョン。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top