uzmanlar için soru #define

 

Merhaba!

#define ayracı kapatmanın bir yolu var mı?

 #define LPE );
#define LP Print ( LPE
void OnStart ()
  {
   LP "myMessage"
  }
 
Amaç ne? parantez yazmamak için mi? Bu büyük bir problem?
 
Dmitry Fedoseev :
Amaç ne? parantez yazmamak için mi? Bu büyük bir problem?


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

ve ortada bir günlük mesajı var

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

kapanmadan çıkıyor

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

ya başlangıç (FUNCSIG, #define ve ardından sonunda kısa bir parantez koydu

 
Amaç ne? Böylece bir makro çağırırken parantez yazmayın?
 
Dmitry Fedoseev :
Amaç ne? Böylece bir makro çağırırken parantez yazmayın?

Diyelim ki makroya __FUNCSIG__ ve ErrorLast eklemek istiyoruz. Bir makro çağrıldığında, koduyla birlikte satırda bir kapatma parantez olacaktır. Yani, evet, düşünce parladı, bunu bir şekilde iyileştirmek mümkün mü?

 
Nikolai Karetnikov :

Diyelim ki makroya __FUNCSIG__ ve ErrorLast eklemek istiyoruz. Bir makro çağrıldığında, koduyla birlikte satırda bir kapatma parantez olacaktır. Yani, evet, düşünce parladı, bunu bir şekilde iyileştirmek mümkün mü?

Soruma neden cevap verilmiyor?

Sadece makro kullanabilir misin? Elbette, eller iki parantez içine düşmedikçe.

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

Soruma neden cevap verilmiyor?

Sadece makro kullanabilir misin? Elbette, eller iki parantez içine düşmedikçe.

parametreleri okumalıydınız, evet)

Teşekkür ederim!

 

Genel olarak, bu şekilde çözülür:

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

Üç seçenek: geçici bir nesne, bir tek ton, bir işlev, - kime, dinde daha yakın)))) Hız açısından, pratik olarak ayırt edilemezler.

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

void OnStart ( void ){
  LOG( "bezgovna" );
}
Ancak, ne yazık ki, enayiler üzerinde bir izlenim bırakmayacaksınız.
 
Dmitry Fedoseev :
Ancak, ne yazık ki, enayiler üzerinde bir izlenim bırakmayacaksınız.

Bu çözümü neden hemen bir kişiye göstermedin?)))

UPD: bezgovna - hayır sh..t yazıldığından)))
 
Vladimir Simakov :

Bu çözümü neden hemen bir kişiye göstermedin?)))

UPD: bezgovna - hayır sh..t yazıldığından)))

Teşekkür ederim! )

Esasen.

Sınıflı bir varyantta da durdum. Günlük kullanım olmadan #define parametreleştirme gibi basit şeyler bile çabucak unutulur.

Sinirler tarafından.

Tanrım, burada herkes ne kadar savunmasız, alt metni olmadan, incitme veya rencide etme niyeti olmadan bir soru soruyorsun, ama hayır, tanınmayan bir dehanın ruhunda bir yerde, başka bir sevgili pahasına kendini gösterme arzusu karıncalanıyor ve eğlenceli. İngilizce forumda bununla karşılaşmıyorum, oraya düzenli olarak yazmama rağmen. Bunu fark ettiğimde, genellikle bu tür açıklamalara tepki vermemeye çalışırım, ancak Dmitry, sözlü bir savaşta eğlenmek istiyorsanız, o zaman sizi kendi yayılımlarınıza daldırarak size zevk vereceğim.