2011-02-02 7 views
3

Je viens de voir ce fil, qui décrit comment ajouter des macros conditionnelles: Conditional value for a #define#define macro conditionnelle pour une fonction - provoquant: « fonction » redéfinie avertissement

mais dans mon cas, je suis en train de définir une fonction dans l'état.

#if TARGET_IPHONE_SIMULATOR 

#define doSomething(){\ 
    \\ does something 
}\ 

#else 

#define doSomething(){\ 
    \\ does something else 
}\ 

#endif 

Cela fonctionne, sauf que je cause compilateur gcc de lancer cet avertissement:

"doSomething" redefined 
This is the location of the previous arguments 

Y at-il de solution pour aider à se débarrasser des mises en garde?

MISE À JOUR:

donc j'ai essayé, y compris la condition dans ma définition:

#define doSomething(){\ 

#if TARGET_IPHONE_SIMULATOR 
    \\ do something 
#else 
    \\ do something else 
#endif 

}\ 

mais génère une erreur:

error: '#' is not followed by a macro parameter. 

Répondre

5

J'ai trouvé la réponse à ma question here.

Conclusion: vous ne pouvez pas inclure #ifdef etc ... à l'intérieur #define, car il ne devrait y avoir une directive de pré-traitement par ligne.

Ainsi, bien que nous pouvons briser la ligne avec une barre oblique inverse « \ » cela permet d'écrire des macros multilignes lisibles, mais le préprocesseur verra comme une ligne:

#define doSomething(){ #if TARGET_IPHONE_SIMULATOR ... #endif } 

qui jette cette erreur:

error: '#' is not followed by a macro parameter. 

Cela a du sens, donc je vais devoir repenser mon implémentation.

1

Il y a une bizarrerie dans votre pensée qui est par analogie/extension. doSomething() doit être vu comme une macro fonctionnelle. En tant que telle, sa définition est ambivalente. Effectuer un zoom arrière et voir ci-dessous:

doSomething() { 
#if TARGET_IPHONE_SIMULATOR 
    // conditionally compiled code 
#else 
    // platform-specific code 
#endif 
} 
+0

vous oubliez que doSomething est une macro définie. Si j'ai #define doSomething() #if ... cela va casser la macro et vous obtiendrez l'erreur: '#' n'est pas suivi d'un paramètre macro. – Bach

0

Une option à prendre en compte consiste à créer une condition dans une macro qui sera résolue au moment de la compilation. Considérez ce qui suit:

Si je souhaite appeler une fonction différente basée sur la valeur de 'c' comme action de pré-processeur, je peux définir une macro qui vérifie la valeur de 'c' de manière statique.

#define AorB(c) ((c>0) ? (Do_A(c)) : (Do_B(c))) 

Ensuite, si vous configurez un niveau d'optimisation qui élimine les branches qui ne sont jamais accessibles, il faut dépouiller que jamais le cas n'a pas été réalisée. Ce n'est peut-être pas exactement ce que vous cherchiez.

1

En outre, cela peut résoudre l'erreur que vous avez reçue:
# et ## ont des fins spéciales dans les définitions de macro. # est utilisé pour entourer un paramètre de macro avec des guillemets doubles. ## est utilisé pour concaténer deux paramètres de macro.Exemple:
#define ABC(X) #X
ABC(hello) résultats dans "hello".
#define XYZ(X,Y) X##Y
XYZ(O,K) résultats dans OK. Notez que cette fonctionnalité est (peut-être) unique à ANSI C.
En outre, pourquoi utiliseriez-vous une macro comme celle-ci? Une fonction pourrait-elle mieux fonctionner pour vous?

+0

"Aussi, pourquoi utiliseriez-vous une macro comme celle-ci?" Ouais exactement, la mauvaise logique à l'époque et m'a fait repenser le but et la mise en œuvre. – Bach