전문가를 위한 질문 #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" );
  }

세 가지 옵션 : 임시 개체, 단일 톤, 기능, - 종교에서 더 가까운 사람))) 속도면에서 실제로 구별 할 수 없습니다.

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

void OnStart ( void ){
  LOG( "bezgovna" );
}
그러나 불행히도 당신은 빨판에 인상을 남기지 않을 것입니다.
 
Dmitry Fedoseev :
그러나 불행히도 당신은 빨판에 인상을 남기지 않을 것입니다.

왜 이 솔루션을 바로 사람에게 보여주지 않았나요?)))

UPD: bezgovna - 철자 없음 sh..t)))
 
Vladimir Simakov :

왜 이 솔루션을 바로 사람에게 보여주지 않았나요?)))

UPD: bezgovna - 철자 없음 sh..t)))

고맙습니다! )

본질적으로.

클래스가 있는 변형에서도 중지했습니다. 매일 사용하지 않는 #define 매개변수화와 같은 기본 사항도 금세 잊혀집니다.

신경으로.

맙소사, 여기 있는 모든 사람이 얼마나 취약한지, 당신은 화를 내거나 기분을 상하게 할 의도가 없이 숨김없이 질문을 던집니다. 그러나 아니요, 인정할 수 없는 천재의 영혼 어딘가에서 다른 연인을 희생시키면서 자신을 주장하려는 욕망이 따끔거리고 재미있습니다. 나는 정기적으로 글을 작성하지만 영어 포럼에서는 이것을 접하지 못합니다. 이것을 깨닫고 나는 보통 그런 말에 반응하지 않으려고 노력하지만, 드미트리가 말싸움을 하고 싶다면, 나는 당신을 자신의 발산에 푹 담그어 즐거움을 줄 것입니다.

사유: