2016-02-24 4 views
10

は定義されています。#defineからCスタイルのキャストを削除するにはどうすればプリプロセッサ#ifで使用できますか?私は、次のプリプロセッサを使用したい

[サードパーティのヘッダー(変更することはできません)]彼らはこのように比較され

#define SWCI_VERSION_MAJOR    (unsigned char) 4 
#define SWCI_VERSION_MINOR    (unsigned char) 16 

[私の実装]

#if SWCI_VERSION_MAJOR >= 4 && SWCI_VERSION_MINOR >= 16 

次に、私は:

致命的なエラーC1017:無効な整数定数式は

私は(unsigned char型)なしでそれらを定義する場合ディレクティブは受け入れられることに気づいたが、私は希望ので、私は定義にアクセスできません可能であれば、問題を回避する。

+1

可能性のある重複したような何か[何を意味するかコンパイルエラーが「トークンが前二項演算子を行方不明」ん?](http://stackoverflow.com/questions/21338385/what-does-the-compiler-error- token-meanの前にmissing-binary-operator-operator) – BoBTFish

+3

エラーメッセージは、別のコンパイラであるため、http://stackoverflow.com/q/21338385/1171191とは異なりますが、エラーは同じです。 AShellyの答えが説明しているように、プリプロセッサでは発生しないので、 '#if'でキャストします。 – BoBTFish

+0

@ j4nSoloあなたが言及したようにそれを比較すれば、あなたはMACROを(unsigned char)なしで定義するのを妨げているでしょうか? –

答えて

13

これは、少し前処理された魔法で動作するようになります。プリプロセッサがマクロを適用する方法により、複数のマクロレベルを使用していくつかの変更を行うことがあります。 Boost.Preprocessorはこの振る舞いを悪用します。このコードは、(unsigned char)のように見えるという事実を利用して、マクロ名Xを前につけることによってマクロ呼び出しを行うことができます。これは何も評価されず、末尾の数字だけが残ります。

#define SWCI_VERSION_MAJOR    (unsigned char) 4 
#define SWCI_VERSION_MINOR    (unsigned char) 16 

#define X(unused) 
#define APPLY(x) x 

#define MAJOR (APPLY(X SWCI_VERSION_MAJOR)) 
#define MINOR (APPLY(X SWCI_VERSION_MINOR)) 

#if MAJOR >= 4 && MINOR >= 16 
#error "Version is greater or equal to 4.16" 
#endif 

#ifの例真評価およびIを添加#errorメッセージを印刷するためhttps://goo.gl/GOsLDLを参照してください。

+0

ありがとう、これは最終的に働いた!注意:APPLY2は1人のヘルパーだけで動作するため、必要ありません。 – j4nSolo

+0

@ j4nSolo「APPLY2」について教えてくれてありがとう。私はそれを削除する編集を提出した。 –

+0

それはとても醜いです、それは美しいです! – TonyK

-2

ただ、次の式で使用する場合は、次の

#define SWCI_VERSION_MAJOR    (unsigned char) 4 
#define SWCI_VERSION_MINOR    (unsigned char) 16 

考える:

#if SWCI_VERSION_MAJOR >= 4 && SWCI_VERSION_MINOR >= 16 

これは、次の の#if(unsigned char型)4> 4に(プリプロセッサによって)変換されます

問題は、この式(符号なしchar)4> 4が間違っているようです。

あなたはサードパーティのヘッダファイルを変更できない場合、あなたは

#undef SWCI_VERSION_MAJOR 

を使用しようとするかもしれない。しかし、これは重くする#include順序に依存し

+4

定義をundefすれば、私はその値を使うことができません。それは私が達成したいと反対です。 – j4nSolo

+0

定義を解除してから正しく定義できます(角カッコで囲みます)。ここ 私は何を意味するかである: include1.h 'の#define SWCI_VERSION_MAJOR(unsigned char型)4' 'の#define SWCI_VERSION_MINOR(unsigned char型)16' includeA.h 'の#if SWCI_VERSION_MAJOR> = 4 && SWCI_VERSION_MINOR> = 16' SWCI_VERSION_MAJOR'の#undef 'do_something_if_version_is_as_expected() '#endif' your.cpp 'の#include "include1.h"' '' SWCI_VERSION_MINOR' #undefの 'の#define SWCI_VERSION_MAJOR((unsigned char型) 4) ' ' #define SWCI_VERSION_MINOR((unsigned char)16) ' コード – rezdm

+0

...申し訳ありませんがフォーマットが間違っていました。この定義が定義されているところで.hをインクルードし、.c/.cppでundefを定義し、正しく再定義することです。 – rezdm

0

問題は、あなたが適切な数値としてこれらのマクロを使用することができないということです。

// Note the next line does not start with a # 
if((unsigned int)SWCI_VERSION_MAJOR >= 4 && (unsigned int)SWCI_VERSION_MINOR >= 16) 
{ 
    // ... 
} 

もちろんのことだけ作品あなたが関数内でそれを使用している場合やifの内容:あなたはifブロック内で何をしたいのかに応じて、あなたはそれ以外の前処理文を行うことを検討することができますブロックはdefineのようなプリプロセッサ文ではありません。

2

多分constexpr関数を使用すると、そのトリックを行いますか?

constexpr bool version_supported(const char major, const char minor) 
{ 
    return major >= 4 && minor >= 16; 
} 
constexpr VERSION_SUPPORTED = version_supported(SWCI_VERSION_MAJOR, SWCI_VERSION_MINOR);