Question pour les experts en #define

 

Bonjour à tous !

Y a-t-il un moyen d'obtenir un crochet fermant à partir de #define ?

#define  LPE );
#define  LP Print( LPE
void OnStart()
  {
   LP "myMessage"
  }
 
Quel est l'intérêt ? Pour éviter d'écrire des parenthèses? C'est un gros problème ?
 
Dmitry Fedoseev:
Quel est l'intérêt ? Pour ne pas avoir à écrire des parenthèses? Est-ce un gros problème ?


#define  LPRINT_END , __FUNCSIG__);
#define  LPRINT gFactory.getCLogManager().doPrint (

et au milieu se trouve un message de journal

LPRINT "abnormal situation, couldn't select position", ENUM_LOG_LEAD_DEBUG

sans la fermeture.

LPRINT (FUNCSIG, "abnormal situation, couldn't select position", ENUM_LOG_LEAD_DEBUG);

soit le début (FUNCSIG à #define et ensuite une parenthèse à la fin

 
Quel est l'intérêt ? Il n'est donc pas nécessaire d'écrire des parenthèses lorsqu'on appelle une macro ?
 
Dmitry Fedoseev:
Quel est l'intérêt ? Il n'est donc pas nécessaire d'écrire des parenthèses lors de l'appel de la macro ?

Disons que nous voulons ajouter __FUNCSIG__ et ErrorLast à une macro. Lorsque la macro est appelée, il y aura une parenthèse fermante sur la ligne contenant son code. Alors, oui, une pensée a germé, y a-t-il un moyen d'améliorer cela ?

 
Nikolai Karetnikov:

disons que nous voulons ajouter __FUNCSIG__ et ErrorLast à une macro. Lorsque la macro est appelée, il y aura une parenthèse fermante sur la ligne contenant son code. Alors, oui, une idée a germé, y a-t-il un moyen d'améliorer cela ?

N'y a-t-il aucun moyen de répondre à ma question ?

Peut-être qu'il suffit d'utiliser les macros normalement ? Sauf, bien sûr, si vos mains tombent de deux parenthèses.

#define  LP(X) Print(X)
void OnStart()
  {
   LP("myMessage");
  }
 
Dmitry Fedoseev:

N'y a-t-il aucun moyen de répondre à ma question ?

Tu ne peux pas utiliser les macros correctement ? Sauf, bien sûr, si vos mains tombent de deux parenthèses.

J'aurais dû me renseigner sur les paramètres, oui )

Merci !

 

En général, c'est ainsi que le problème est résolu :

#define  LOG_S(dText) (SLog(__FUNCSIG__,__FILE__,__LINE__,dText)).Log()
#define  LOG_C(dText) CLog::Get().Log(__FUNCSIG__,__FILE__,__LINE__,dText)
#define  LOG_F(dText) Log(__FUNCSIG__,__FILE__,__LINE__,dText)

struct SLog{
   string cText;
   SLog(string mFunc,string mFile,int mLine,string mText):
      cText(StringFormat("%s, %s, line %i, %s",mFunc,mFile,mLine,mText)){}
   void Log() {Print(cText);}
};

class CLog{
   CLog(){}
public:
   static CLog* Get(){
      static CLog instance;
      return &instance;}
   void Log(string mFunc,string mFile,int mLine,string mText) {PrintFormat("%s, %s, line %i, %s",mFunc,mFile,mLine,mText);}
};

void Log(string mFunc,string mFile,int mLine,string mText) {PrintFormat("%s, %s, line %i, %s",mFunc,mFile,mLine,mText);}


void OnStart(void)
  {
  LOG_S("struct");
  LOG_C("class");
  LOG_F("func");
  }

Trois options : objet temporaire, singletone, fonction - celle qui est la plus religieuse). En termes de vitesse, ils sont pratiquement indiscernables.

 
#define  LOG(dText) printf("%s, %s, line %i, %s",__FUNCSIG__,__FILE__,__LINE__,dText);

void OnStart(void){
  LOG("bezgovna");
}
Mais malheureusement, vous n'impressionnerez pas les pigeons.
 
Dmitry Fedoseev:
Mais, malheureusement, on n'impressionne pas les nuls.

Pourquoi n'avez-vous pas montré cette solution à l'homme tout de suite) ?

UPD : bezgovna - épelé sans sh..t ))))
 
Vladimir Simakov:

Pourquoi n'avez-vous pas montré cette solution à l'homme tout de suite) ?

UPD : bezgovna - épelé sans sh..t )))

Merci ! )

Essentiellement.

Je me suis arrêté à la variante avec la classe. Même des choses aussi élémentaires que la paramétrisation #define sont rapidement oubliées sans une utilisation quotidienne.

Sur les nerfs.

Mon Dieu, comme tout le monde est sensible ici ; on peut poser une question sans sous-entendu, sans intention d'offenser ou d'insulter, mais non, quelque part dans l'âme d'un génie méconnu, il y a un agacement et un désir de s'affirmer aux dépens d'un autre amateur. Je ne le rencontre pas sur le forum anglais, bien que j'y écrive régulièrement. Conscient de cela, j'essaie généralement de ne pas réagir à de telles remarques, mais si Dmitry, vous voulez vous ébattre dans une bataille verbale, je vous ferai le plaisir de vous plonger la tête la première dans vos propres émanations.

Raison: