2017-11-24 34 views
2

幾何学ベースのコードで作業しています。現在の課題には、固体試料を収容するためのバウンディングボックスの使用が含まれる。さて、コードでは、私はそのようなボックスの2つの異なるタイプ、すなわちINNER_BOUNDING_BOXOUTER_BOUNDING_BOXを考案しました。このコードでは、2つのボックスのいずれか1つの使用を想定していますが、両方を使用することはありません。私はプリプロセッサの使用によってそれを達成しようとしています。 私は、2つのマクロ、すなわちUSE_INNER_BOUNDING_BOXUSE_OUTER_BOUNDING_BOXに基づいてさらにコードを書いています。私はいつでもいずれかのマクロはこのようにいくつかの単純な構造によって定義されていることを確認することができます:私は、任意の特定のボックスを使用したい場合デフォルトをエミュレートするための条件付きマクロ定義

#if defined(USE_INNER_BOUNDING_BOX) && defined(USE_OUTER_BOUNDING_BOX) 
    #undef USE_INNER_BOUNDING_BOX 
    #undef USE_OUTER_BOUNDING_BOX 
    #define USE_INNER_BOUNDING_BOX 
#endif 

#ifndef USE_INNER_BOUNDING_BOX 
    #ifndef USE_OUTER_BOUNDING_BOX 
     #define USE_INNER_BOUNDING_BOX 
    #endif 
#endif 

は今、私はちょうど対応するマクロを定義することができます。難しかったのは、デフォルト設定マクロsay USE_DEFAULT_BOUNDING_BOXを使いたいということでした。それで、どちらも明示的に定義されていない場合にはUSE_INNER_BOUNDING_BOXまたはUSE_OUTER_BOUNDING_BOXのいずれかの定義を設定することができました。 私は移植可能なコードに傾いているだろうが、コンパイラ固有のトリックも渡すことができます。私はVisual Studio 2012を使用しています。

+1

本当にあなたが聞いた質問に対する答えはありませんが、単一のスイッチ 'BOUNDING_BOX_TO_USE'を' INNER == 1' 'OUTER == 2'と定義するのはなぜですか?そうすれば、それは本質的に両方ではない可能性があります。 – Yunnosch

+0

私は同様の行に何かを書くことができました。その時私には打撃を与えませんでした。 :)私は別の方法でそれを実装しようとします。しかし、それはまだ偶然の質問であり、それは楽しいので、私は尋ねた。 :) – user2338150

+0

これらのマクロブロックは、あなたが望むものをすでに実行しています。しかしそれはもっと短くてもよい。 – VTT

答えて

1

信頼性の高いワンの多くの選択が良く、すぐに単一のマルチ値スイッチでそれらを選択することによって行うことができます。

#define BOUNDING_INNER 1 
#define BOUNDING_OUTER 2 

/* default */ 
#define BOUNDING_BOX_TO_USE BOUNDING_INNER 

/* alternatively please activate below line 
#define BOUNDING_BOX_TO_USE BOUNDING_OUTER 
*/ 

あなたには、いくつかの構成に下位互換性を保つために必要がある場合は、
例えばあなたのコードは既に他の人によって使用されていますが、
から2つのスイッチを派生させることができます。 利点は、#undefを避けることです(そうすることに利点があると認められる場合に備えて)。

// Comment to use bigger outer Bounding-Box 
#define USE_INNER_BOUNDING_BOX 

#define INNER_BOUNDING_BOX 0 
#define OUTER_BOUNDING_BOX 1 

#define DEFAULT_BOUNDING_BOX OUTER_BOUNDING_BOX 

#if defined(USE_INNER_BOUNDING_BOX) && !defined(USE_OUTER_BOUNDING_BOX) 
    #define USE_BOUNDING_BOX INNER_BOUNDING_BOX 
#elif defined(USE_OUTER_BOUNDING_BOX) 
    #define USE_BOUNDING_BOX OUTER_BOUNDING_BOX 
#else 
    #define USE_BOUNDING_BOX DEFAULT_BOUNDING_BOX 
#endif 

#if (USE_BOUNDING_BOX == INNER_BOUNDING_BOX) 
    #undef USE_OUTER_BOUNDING_BOX 
    #define USE_INNER_BOUNDING_BOX 
#else 
    #undef USE_INNER_BOUNDING_BOX 
    #define USE_OUTER_BOUNDING_BOX 
#endif 

これはちょうどこのケースで動作します。ここでは

#if defined(USE_INNER_BOUNDING_BOX) && defined(USE_OUTER_BOUNDING_BOX) 
#define BOUNDING_BOX_TO_USE BOUNDING_INNER 
#endif 

#ifndef USE_INNER_BOUNDING_BOX 
    #ifndef USE_OUTER_BOUNDING_BOX 
     #define BOUNDING_BOX_TO_USE BOUNDING_INNER 
    #endif 
#endif 

/* In case you are as paranoid a programmer as I am, 
    you might want to do some plausibility checking 
    here. ifndef, >0, <2 etc., triggering some #errors. */ 


/* Later, in code doing the actual implementation: */ 

#if (BOUNDING_BOX_TO_USE == BOUNDING_INNER) 
/* do inner bounding stuff */ 
#endif 
/* other code, e.g. common for inner and outer */ 
#if (BOUNDING_BOX_TO_USE == BOUNDING_OUTER) 
/* do outer bounding stuff */ 
#endif 
+0

私は答えとしてそれを取るでしょう。代わりにequalsブロックにUSE_OUTER_BOUNDING_BOXまたはUSE_INNER_BOUNDING_BOXを定義し、前のブロックで同じものを別のものに置き換えます。はい、私は定義されたままにして、undefsを避けたいと思います。接続されていない、認識されていないコードからの矛盾する定義の真っ只中にいるのではないか、一般的な意味では良い習慣ではありませんか? – user2338150

+0

私は実際にあなたが尋ねている練習を実際には得られないと思いますか? undefを使用しますか?私の意見では良くありません。すでに配布されている構成概念との下位互換性を維持しますか?私の意見では良い。矛盾する定義を整理する?良い。そうするためにundefsを取り除くことは?良い。 – Yunnosch

+1

ええと、IDEやプロジェクトファイル、Makefileからの定義が欠けていました。申し訳ありませんが、私は会話の真っ只中にいなければなりませんでした。とにかく、私はコードコンパイルの悲しみのいくつかを共有することができたと思います。あなたが妄想になりたいと思って、私は何か違うと思うことができたらいいと思う。 – user2338150

0

Iは一ブール変数を使用する2つだけの値があるので:

#ifndef USE_OUTER_BOUNDING_BOX 
    #define USE_OUTER_BOUNDING_BOX 0 
#endif 

USE_OUTER_BOUNDING_BOXがゼロである場合(偽)内側境界ボックスが使用されます。

test.cの:

#include <stdio.h> 

#ifndef USE_OUTER_BOUNDING_BOX 
    #define USE_OUTER_BOUNDING_BOX 0 
#endif 

int main(void) 
{ 
    printf("%d\n", USE_OUTER_BOUNDING_BOX); 
    return 0; 
} 

例:それらのような

$ cc -o test -DUSE_OUTER_BOUNDING_BOX=0 test.c 
$ ./test 
0 
$ cc -o test -DUSE_OUTER_BOUNDING_BOX=1 test.c 
$ ./test 
1 
+0

これは確かにこの場合ここではうまくいくでしょうが、2つ以上のボックスが関わっていればうまくいくかもしれない過大なプリプロセサのトリックを得ることを試みていました。私はそのような質問を語っていたはずです。とにかく、あなたのコードも私の場合は動作しますが、明示的に指定したくないマクロの値に依存する必要があります。私はここでこの簡単な修正で終わった。もちろん、より多くのボックスタイプ(条件付きブロック)のために変更する必要があります: – user2338150

0

は私が終わったものです。より多くのボックスの場合は、条件付きブロックを追加します。

関連する問題