pergunta para #define experts

 

Olá a todos!

Existe alguma forma de obter um suporte de fechamento a partir de #define?

#define  LPE );
#define  LP Print( LPE
void OnStart()
  {
   LP "myMessage"
  }
 
Qual é o objetivo? Para evitar escrever parênteses? Isso é um grande problema?
 
Dmitry Fedoseev:
Qual é o objetivo? Então você não tem que escrever parênteses? É um grande problema?


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

e no meio está uma mensagem de log

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

sem o fechamento.

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

ou o início (FUNCSIG para #define e depois um parêntese no final

 
Qual é o objetivo? Então você não tem que escrever parênteses ao chamar uma macro?
 
Dmitry Fedoseev:
Qual é o objetivo? Então você não tem que escrever parênteses ao chamar a macro?

digamos que queremos adicionar __FUNÇÕES__ e ErroÚltimo a uma macro. Quando a macro é chamada, haverá um parêntese de fechamento na linha com seu código. Então, sim, um pensamento que se espalhou, há alguma maneira de melhorar isso?

 
Nikolai Karetnikov:

digamos que queremos adicionar __FUNÇÕES__ e ErroÚltimo a uma macro. Quando a macro é chamada, haverá um parêntese de fechamento na linha com seu código. Então, sim, um pensamento que piscou, há alguma maneira de melhorar isso?

Não há maneira de responder à minha pergunta?

Talvez apenas usar macros normalmente? A menos, é claro, que suas mãos caiam de dois parênteses.

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

Não há maneira de responder à minha pergunta?

Você não pode simplesmente usar as macros corretamente? A menos, é claro, que suas mãos caiam de dois parênteses.

Eu deveria ter lido sobre parâmetros, sim )

Obrigado!

 

Em geral, é assim que é resolvido:

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

Três opções: objeto temporário, monótono, função - o que for mais religioso). Em termos de velocidade, eles são praticamente indistinguíveis.

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

void OnStart(void){
  LOG("bezgovna");
}
Mas infelizmente, você não vai impressionar os otários.
 
Dmitry Fedoseev:
Mas, infelizmente, você não impressiona os otários.

Por que você não mostrou logo essa solução ao homem?)

UPD: bezgovna - soletrada sem sh..t ))))
 
Vladimir Simakov:

Por que você não mostrou logo essa solução ao homem?)

UPD: bezgovna - soletrada sem sh..t )))

Obrigado! )

Essencialmente.

Eu parei na variante com a classe. Mesmo coisas tão elementares como #define parametrização são rapidamente esquecidas sem uso diário.

Com os nervos em franja.

Deus, como todo mundo é sensível aqui; você pode fazer uma pergunta sem implicação, sem a intenção de ofender ou insultar, mas não, em algum lugar na alma de um gênio não reconhecido você tem um incômodo e um desejo de se afirmar às custas de mais um amador. Não o encontro no fórum inglês, embora eu escreva lá regularmente. Percebendo isto, eu geralmente tento não reagir a tais observações, mas se Dmitry, você quiser brincar em uma batalha verbal, eu lhe darei prazer mergulhando-o de cabeça em suas próprias emanações.

Razão: