вопрос к знатокам #define

 

Всем привет!

Можно ли как-то добиться от #define закрывающей скобки?

#define LPE );
#define LP Print( LPE
void OnStart()
  {
   LP "myMessage"
  }
 
А в чем смысл? Чтобы не писать круглые скобки? Это большая проблема?
 
Dmitry Fedoseev:
А в чем смысл? Чтобы не писать круглые скобки? Это большая проблема?


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

а в центре сообщение в журнал

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

без закрывающей выходит

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

либо начало (FUNCSIG вносить в #define и тогда куцая скобка в конце

 
А в чем смысл? Чтобы при вызове макроса не писать круглые скобки?
 
Dmitry Fedoseev:
А в чем смысл? Чтобы при вызове макроса не писать круглые скобки?

допустим мы хотим __FUNCSIG__ и ErrorLast добавить к макросу. При вызове макроса на строке с его кодом будет одна закрывающая скобка. Так что, да мелькнула мысль, нельзя ли это как-то усовершенствовать

 
Nikolai Karetnikov:

допустим мы хотим __FUNCSIG__ и ErrorLast добавить к макросу. При вызове макроса на строке с его кодом будет одна закрывающая скобка. Так что, да мелькнула мысль, нельзя ли это как-то усовершенствовать

А на мой вопрос никак нельзя ответить? 

Может просто макросами нормально пользоваться? Если, конечно, руки не отвалятся от двух круглых скобок.

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

А на мой вопрос никак нельзя ответить? 

Может просто макросами нормально пользоваться? Если, конечно, руки не отвалятся от двух круглых скобок.

про параметры надо было прочитать, да )

Спасибо!

 

В общем виде - это вот так решается:

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

Три варианта: временный объект, singletone, функция, - кому, что по религии ближе))) По быстродействию, практически не различимы.

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

void OnStart(void){
  LOG("bezgovna");
}
Но, к сожалению, на лохов впечатления не произведешь.
 
Dmitry Fedoseev:
Но, к сожалению, на лохов впечатления не произведешь.

А че сразу это решение человеку не показал?)))

UPD: bezgovna - пишется no sh..t )))
 
Vladimir Simakov:

А че сразу это решение человеку не показал?)))

UPD: bezgovna - пишется no sh..t )))

Спасибо! )

По существу.

На варианте с классом я и остановился. Даже такие элементарные вещи, как параметризация #define без ежедневного употребления быстро забываются. 

По нервам.

Боже, какие здесь все ранимые, задашь вопрос без подтекста, без намерения обидеть или оскорбить, но нет, где-то в душе непризнанного гения свербит и тешется желание самоутвердиться за счет очередного любителя. На английском форуме с этим не сталкиваюсь, хотя пишу там регулярно. Осознавая это, на подобные замечания обычно я стараюсь не реагировать, но если Дмитрий, вы желаете порезвиться в словесной битве, то я доставлю вам удовольствие окунув вас с головой в ваши же эманации.  

Причина обращения: