pregunta para los expertos en #define

 

Hola a todos.

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

#define  LPE );
#define  LP Print( LPE
void OnStart()
  {
   LP "myMessage"
  }
 
¿Qué sentido tiene? ¿Para evitar escribir paréntesis? ¿Es un gran problema?
 
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

 
¿Qué sentido tiene? Entonces, ¿no hay que escribir paréntesis cuando se llama a una macro?
 
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

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

 

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.

 
#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.
 
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 ))))
 
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.