pregunta para los expertos en #define

Nikolai Karetnikov  

Hola a todos.

¿Hay alguna manera de obtener un corchete de cierre de #define?

#define  LPE );
#define  LP Print( LPE
void OnStart()
  {
   LP "myMessage"
  }
Nikolai Karetnikov  
Dmitry Fedoseev:
¿Qué sentido tiene? ¿Así que no tienes que escribir paréntesis? ¿Es un gran problema?


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

y en el medio hay un mensaje de registro

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

sin el cierre.

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

o bien al principio (FUNCSIG a #define y luego un paréntesis al final

Dmitry Fedoseev  
¿Qué sentido tiene? Entonces, ¿no hay que escribir paréntesis cuando se llama a una macro?
Nikolai Karetnikov  
Dmitry Fedoseev:
¿Qué sentido tiene? Entonces, ¿no hay que escribir paréntesis cuando se llama a una macro?

Digamos que queremos añadir __FUNCSIG__ y ErrorLast a una macro. Cuando se llame a la macro, habrá un paréntesis de cierre en la línea con su código. Así que, sí, un pensamiento se me pasó por la cabeza, ¿hay alguna manera de que esto se pueda mejorar

Dmitry Fedoseev  
Nikolai Karetnikov:

Digamos que queremos añadir __FUNCSIG__ y ErrorLast a una macro. Cuando se llame a la macro, habrá un paréntesis de cierre en la línea con su código. Así que, sí, un pensamiento se me pasó por la cabeza, ¿hay alguna manera de que esto se pueda mejorar

¿No hay manera de responder a mi pregunta?

¿Tal vez sólo utilizar las macros normalmente? A menos, claro, que se te caigan las manos de dos paréntesis.

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

¿No hay manera de responder a mi pregunta?

¿No puedes utilizar las macros correctamente? A menos, claro, que se te caigan las manos de dos paréntesis.

Debería haber leído sobre los parámetros, sí )

Gracias.

Vladimir Simakov  

En general, así es como se resuelve:

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

Tres opciones: objeto temporal, monotributo, función, la que sea más religiosa). En términos de velocidad, son prácticamente indistinguibles.

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

void OnStart(void){
  LOG("bezgovna");
}
Pero, por desgracia, no impresionarás a los tontos.
Vladimir Simakov  
Dmitry Fedoseev:
Pero, desgraciadamente, no se impresiona a los tontos.

¿Por qué no le mostró esta solución al hombre de inmediato?)

UPD: bezgovna - deletreado sin sh..t ))))
Nikolai Karetnikov  
Vladimir Simakov:

¿Por qué no le mostró esta solución al hombre de inmediato?)

UPD: bezgovna - deletreado sin sh..t )))

Gracias. )

Esencialmente.

Me detuve en la variante con la clase. Incluso cosas tan elementales como la parametrización #define se olvidan rápidamente sin el uso diario.

Sobre los nervios.

Dios, qué sensible es todo el mundo aquí; se puede hacer una pregunta sin implicación, sin intención de ofender o insultar, pero no, en algún lugar del alma de un genio no reconocido hay un deseo ardiente de hacerse valer a costa de otro aficionado. No lo encuentro en el foro de inglés, aunque escribo allí regularmente. Al darme cuenta de ello, suelo intentar no reaccionar ante tales comentarios, pero si Dmitry, quieres retozar en una batalla verbal, te daré el placer de sumergirte de cabeza en tus propias emanaciones.

Razón de la queja: