2016-05-19 4 views
0

私は、コンパイル時にモジュールを組み込むために使用される多くの定義を持つ設定ファイルを持っています。さらに、これは、定義のためのコードの中で非常によく調べなければならないことを意味します。すべてのチェックには3行が必要ですが、これは1行で行うことができます。1行#if文

#if FUNC_ENABLED 
function_optional_call(); 
#endif 

私は何かが好きです。

CALL(function_optional_call(),FUNC_ENABLED); 

これは可能なのですか?3行の式を使用する必要がありますか? 私は、すべてのマクロのためにマクロを定義する可能性を知っています。

Skip function call if not defined

しかしgenerall makroを生成することが可能です。

+0

どのコンパイラとバージョンを使用していますか?これはプリプロセッサ固有のものなので、一般的なやり方があるとは思っていません。あなたはいくつかのトリックに頼らざるを得ません。 – Neil

+0

私が使用した(90年代に戻った)Cコンパイラのほとんどは、#define内で#ifを許可しませんでした(したがって、あなたが持つ問題です)。あなたがC++ライブラリであるboostを使うことができない限り(他の答えによると)、それは容易に解決できそうにありません。 – Neil

答えて

0

それはBOOST_PP_IFはまったく同じものだという事実に、Boost.PPの助けを借りて、非常に簡単です:

#include <boost/preprocessor/if.hpp> 

#define CALL(expr, cond) \ 
    BOOST_PP_IF(cond, expr,) 

CALLのすべての使用はcondの値に応じて、exprまたは何に展開されます。

Live on Coliru

+0

これはまさに私が探しているものですが、C++ヘッダーになるための縫い目です。 – Schafwolle

+0

@Schafwolleそうではありません。 Boost.PreprocessorはC/C++多言語ライブラリであり、両方とも動作します。実際のサンプル*は '-x c'フラグでCとしてコンパイルされています。 – Quentin

+0

@Quention Thxもちろん、CALLはちょうどダミーの名前だったので、私は直接私たちにブーストmakroを – Schafwolle

4
#if FUNC_ENABLED 
function_optional_call(); 
#endif 

は、コンパイラスイッチを作成する標準的な方法です。それは明らかです、それは読める、すべてのプログラマーはそれが何を理解しています。

今、このコード:

CALL(function_optional_call(),FUNC_ENABLED); 

は完全に神秘的です。それは何のために、なぜマクロがあるのか​​はっきりしていません...それは有効なCのようにも見えません。

したがって、最初の形式は後者に比べてはるかに優れています。だから後者に後者を書き直そうとしないでください。


同じ行を何度も繰り返していると心配するのではなく、コンパイラスイッチの配置が間違っているように見えます。関数の中に入れてください。または、関数を変更できない場合は、ラッパーを作成します。以前に

+0

さて、正直言って、最初のものも良くないです。条件付きコンパイルのコンパイルは、プリプロセッサーガードを使用するたびに1回の使用を守ることで解決されるべきではありません。それは単に読めないコードを作成するだけです。 Vimソースは良い例ですが、コードベース全体に '#if'を振りかざしています。 – Leandros

1

、持っている:

#if FUNC_ENABLED 
# define func_optional() real_func_name() 
#else 
# define func_optional() 
#endif 

をあなたは、例えば、セミコロンによって引き起こされる問題を回避するために、第2の場合にはいくつかのトリックを使用することができますdo {} while (0)