Heads up: C'est une question étrange.Extension de macro conditionnelle
J'ai quelques macros très utiles que j'aime utiliser pour simplifier la journalisation. Par exemple je peux faire Log(@"My message with arguments: %@, %@, %@", @"arg1", @"arg2", @"arg3")
, et cela se développera dans une invocation de méthode plus complexe qui inclut des choses comme self
, _cmd
, __FILE__
, __LINE__
, etc, de sorte que je peux facilement suivre où les choses sont enregistrées. Cela fonctionne très bien.
Maintenant, je voudrais développer mes macros pour non seulement travailler avec les méthodes Objective-C, mais les fonctions générales C. Le problème est les portions self
et _cmd
qui sont dans la macro-expansion. Ces deux paramètres n'existent pas dans les fonctions C. Idéalement, j'aimerais pouvoir utiliser ce même ensemble de macros dans les fonctions C, mais je rencontre des problèmes. Lorsque j'utilise (par exemple) ma macro Log()
, j'obtiens des avertissements de compilation à propos de self
et _cmd
qui ne sont pas déclarés (ce qui est tout à fait logique).
Ma première pensée était de faire quelque chose comme ce qui suit (dans ma macro):
if (thisFunctionIsACFunction) {
DoLogging(nil, nil, format, ##__VA_ARGS__);
} else {
DoLogging(self, _cmd, format, ##__VA_ARGS__);
}
Ce produit encore des avertissements du compilateur, puisque est substitué en place toute l'instruction if() de la macro, ce qui des erreurs avec les mots-clés self
et _cmd
(même s'ils ne seront jamais exécutés pendant l'exécution de la fonction).
Ma pensée suivante était de faire quelque chose comme ça (dans ma macro):
if (thisFunctionIsACFunction) {
#define SELF nil
#define CMD nil
} else {
#define SELF self
#define CMD _cmd
}
DoLogging(SELF, CMD, format, ##__VA_ARGS__);
qui ne fonctionne pas, malheureusement. Je reçois "erreur:" # "n'est pas suivi d'un paramètre macro" sur mon premier #define
.
Mon autre pensée était de créer un deuxième ensemble de macros, spécifiquement pour une utilisation dans les fonctions C. Cela sent une mauvaise odeur de code, et je ne veux vraiment pas faire cela. Y at-il un moyen d'utiliser le même ensemble de macros à l'intérieur des méthodes Objective-C et des fonctions C, et seulement référence self
et _cmd
si la macro est dans une méthode Objective-C?
modifier plus d'informations:
thisFunctionIsACFunction
est déterminée d'une manière assez rudimentaire (et je suis certainement ouvert à des améliorations et suggestions). Fondamentalement, il est ceci:
BOOL thisFunctionIsACFunction == (__PRETTY_FUNCTION__[0] != '-' && __PRETTY_FUNCTION__[0] != '+');
Il est reposant sur le comportement du compilateur préfixer un « - » ou « + » par exemple et les méthodes de classe sur les objets Objective-C. Tout le reste doit être une fonction C (puisque les fonctions C ne peuvent pas avoir de noms commençant par '-' ou '+'). Je comprends que cette vérification est techniquement un contrôle d'exécution, puisque __PRETTY_FUNCTION__
est remplacé par un char*
, et c'est probablement le principal obstacle à ma demande d'aide.
Comment venez-vous avec 'thisFunctionIsACFunction'? – Artelius
@Artelius question éditée avec plus d'informations –