Preprocessor directives, logs et fonctions

Bonjour,


 


je souhaite désactiver tous les NSLog d'une classe.


 


En m'inspirant des posts sur ce sujet (comme http://forum.cocoacafe.fr/topic/9378-vos-macros-les-plus-utiles/page-3?hl=+macro%20+utiles), j'ai essayé de faire cela mais ça ne marche pas. Je connais très mal tout ce qui est preprocessor directives ainsi que les fonctions (non objet-oriented).



// MyClass.m
//
// tout en haut après les #import mais avant les @interface et @implementation
#define DEBUGING_GenericItemController 1

#undef MyLogDebuging//(frmt, ...)


#if (DEBUGING_GenericItemController)
    #define MyLogDebuging(frmt, ...) NSLog(frmt, ...)
#else
    #define MyLogDebuging(frmt, ...)
#endif

L'erreur indiquée est :


Réponses

  • LexxisLexxis Membre
    janvier 2014 modifié #2

    C'est peut-être le #define qui n'est pas bien déclaré.


     


    Essai ça



    #define MyLogDebuging(frmt, ...) NSLog(frmt, ##__VA_ARGS__)

    ou



    #define MyLogDebuging(frmt, args ...) NSLog(frmt, ## args)

    EDIT: Correction de la boulette...


  • Merci ! Malheureusement, ça ne marche pas :( Voici l'erreur qu'il renvoie.


  • AliGatorAliGator Membre, Modérateur
    Le nom magique du paramètre pour reprendre les arguments d'une "variadic macros" (= macros à  nombre variable d'argument) est "__VA_ARGS__" et non "__VA_ARGS", d'où l'erreur.

    Dans le code de Lexxis, remplace "__VA_ARGS" par "__VA_ARGS__", ou utilise sa 2e proposition, et ça devrait marcher.

    Pour plus d'informations : http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html
  • Super ça marche !


     


    (pour la deuxième solution j'avais dû oublier les ##)


     


    Voici un code qui marche pour ceux qui sont intéressés.


     




    //
    //  MyClass.m
    //
    //


    #import "MyClass.h"






    /*
     ************************
     Log à  la demande
     ************************
     */
    #define DEBUGING_MyClass 1 // pour désactiver les logs mettre 0


    #if (DEBUGING_MyClass)
        #define MyLogDebuging(frmt, ...) NSLog(frmt, ##__VA_ARGS__)
    #else
        #define MyLogDebuging(frmt, ...)
    #endif










    @implementation MyClass






    - (id)init
    {
        MyLogDebuging(@Initialisation d'un objet de %@", [self class]);


        self = [super init] ;


        if (self)
        {
        //
        }


        return self ;
    }




    @end

Connectez-vous ou Inscrivez-vous pour répondre.