Je travaille sur du code basé sur la géométrie. La tâche à accomplir consiste à utiliser une boîte englobante pour contenir le spécimen solide. Maintenant, dans le code, j'ai conçu deux types différents de telles boîtes, à savoir INNER_BOUNDING_BOX et OUTER_BOUNDING_BOX. Le code s'attend en outre à utiliser l'une des deux cases, mais pas les deux. J'essaye d'y parvenir grâce à l'utilisation d'un préprocesseur. J'ai écrit un code supplémentaire basé sur quelques macros, à savoir USE_INNER_BOUNDING_BOX et USE_OUTER_BOUNDING_BOX. Je peux m'assurer qu'à tout moment, une macro est définie par une construction simple comme celle-ci:

#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

Maintenant, si je voulais utiliser une boîte particulière, je pourrais simplement définir la macro correspondante. La difficulté vient du fait de vouloir utiliser une macro de paramétrage par défaut, disons USE_DEFAULT_BOUNDING_BOX, que je pourrais utiliser pour ensuite configurer une définition pour l'un des USE_INNER_BOUNDING_BOX ou USE_OUTER_BOUNDING_BOX lorsque les deux ou aucun d'entre eux ne sont défini explicitement. Je serais enclin au code portable, mais une astuce spécifique au compilateur pourrait également passer. J'utilise Visual Studio 2012.

2
user2338150 24 nov. 2017 à 11:57

3 réponses

Meilleure réponse

Des sélections fiables parmi plusieurs comme celles-ci peuvent être mieux effectuées en les sélectionnant immédiatement avec un seul commutateur à valeurs multiples.

#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
*/

Si vous devez rester rétrocompatible avec certaines configurations,
par exemple. votre code a déjà été utilisé par d'autres,
vous pouvez dériver le commutateur unique des deux, correspondant à votre comportement par défaut. L'avantage est d'éviter #undef (au cas où vous conviendrez que c'est un avantage de le faire).

#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
1
Yunnosch 24 nov. 2017 à 09:22

Voici ce que j'ai terminé avec:

// 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

Cela fonctionne juste dans ce cas. Dans le cas de plus de boîtes, j'ajouterais les blocs conditionnels.

0
user2338150 24 nov. 2017 à 10:21

Puisqu'il n'y a que deux valeurs, j'utiliserais une seule variable booléenne:

#ifndef USE_OUTER_BOUNDING_BOX
    #define USE_OUTER_BOUNDING_BOX 0
#endif

Si USE_OUTER_BOUNDING_BOX est égal à zéro (faux), le cadre de délimitation interne est utilisé.

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;
}

Exemple:

$ 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
August Karlstrom 24 nov. 2017 à 10:04
47469606