Frage an #define-Experten

 

Hallo zusammen!

Gibt es eine Möglichkeit, eine schließende Klammer von #define zu erhalten?

#define  LPE );
#define  LP Print( LPE
void OnStart()
  {
   LP "myMessage"
  }
 
Was soll das bringen? Um das Schreiben von Klammern zu vermeiden? Ist das ein großes Problem?
 
Dmitry Fedoseev:
Was soll das bringen? Sie brauchen also keine Klammern zu setzen? Ist das ein großes Problem?


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

und in der Mitte steht eine Protokollmeldung

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

ohne die Schließung.

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

entweder am Anfang (FUNCSIG bis #define und dann eine Klammer am Ende

 
Was soll das bringen? Sie brauchen also keine Klammern zu setzen, wenn Sie ein Makro aufrufen?
 
Dmitry Fedoseev:
Was soll das bringen? Sie müssen also keine Klammern schreiben, wenn Sie das Makro aufrufen?

Nehmen wir an, wir wollen __FUNCSIG__ und ErrorLast zu einem Makro hinzufügen. Wenn das Makro aufgerufen wird, steht eine schließende Klammer in der Zeile mit seinem Code. Also, ja, ein Gedanke blitzte auf, gibt es eine Möglichkeit, dies zu verbessern

 
Nikolai Karetnikov:

Nehmen wir an, wir wollen __FUNCSIG__ und ErrorLast zu einem Makro hinzufügen. Wenn das Makro aufgerufen wird, steht eine schließende Klammer in der Zeile mit seinem Code. Also, ja, ein Gedanke blitzte auf, gibt es eine Möglichkeit, dies zu verbessern

Gibt es keine Möglichkeit, meine Frage zu beantworten?

Vielleicht einfach Makros normal verwenden? Es sei denn, Ihnen fallen zwei Klammern aus der Hand.

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

Gibt es keine Möglichkeit, meine Frage zu beantworten?

Können Sie nicht einfach Makros richtig verwenden? Es sei denn, Ihnen fallen zwei Klammern aus der Hand.

Ich hätte mich über Parameter informieren sollen, ja )

Ich danke Ihnen!

 

Im Allgemeinen wird das Problem so gelöst:

#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");
  }

Drei Optionen: temporäres Objekt, Einzelnes, Funktion - je nachdem, was religiöser ist). In Bezug auf die Geschwindigkeit sind sie praktisch nicht voneinander zu unterscheiden.

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

void OnStart(void){
  LOG("bezgovna");
}
Aber leider werden Sie die Trottel nicht beeindrucken.
 
Dmitry Fedoseev:
Aber leider beeindruckt man keine Dummköpfe.

Warum haben Sie dem Mann diese Lösung nicht gleich gezeigt?)

UPD: bezgovna - ohne Sch..t geschrieben ))))
 
Vladimir Simakov:

Warum haben Sie dem Mann diese Lösung nicht gleich gezeigt?)

UPD: bezgovna - ohne Sch..t buchstabiert )))

Ich danke Ihnen! )

Im Wesentlichen.

Ich bin mit der Klasse bei der Variante stehen geblieben. Selbst so elementare Dinge wie die #define-Parametrisierung werden ohne täglichen Gebrauch schnell vergessen.

Auf die Nerven gehen.

Gott, wie empfindlich alle hier sind; man kann eine Frage stellen, ohne eine Andeutung zu machen, ohne die Absicht, zu beleidigen oder zu verletzen, aber nein, irgendwo in der Seele eines unerkannten Genies gibt es ein Nörgeln und den Wunsch, sich auf Kosten eines anderen Amateurs durchzusetzen. Im englischen Forum begegnet mir das nicht, obwohl ich dort regelmäßig schreibe. Da ich mir dessen bewusst bin, versuche ich normalerweise nicht auf solche Bemerkungen zu reagieren, aber wenn du, Dmitry, dich in einer verbalen Schlacht austoben willst, werde ich dir das Vergnügen machen, dich kopfüber in deine eigenen Emanationen zu stürzen.