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 を追加したいとします。マクロが呼び出されると、そのコードのある行に閉じ括弧が1つ付くことになります。そうだ、これを何とか改善できないか、という思いが頭をよぎった。

 
Nikolai Karetnikov:

例えば、あるマクロに __FUNCSIG__ と ErrorLast を追加したいとします。マクロが呼び出されると、そのコードのある行に閉じ括弧が1つ付くことになります。そうだ、これを改善する方法はないだろうか、と思いついたのです。

私の質問に答える方法はないのでしょうか?

普通にマクロを使えばいいのでは?もちろん、2つの括弧から手が落ちなければの話ですが。

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

私の質問に答える方法はないのでしょうか?

マクロをちゃんと使えないの?もちろん、2つの括弧から手が落ちなければの話ですが。

パラメータについて読んでおけばよかったです、はい )

ありがとうございました。

 

一般的には、このように解決されます。

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

3つの選択肢:テンポラリーオブジェクト、シングルトーン、関数 - どちらが宗教的か)速度の面では、実質的に見分けがつかないほどです。

 
#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のパラメータ化など、初歩的なことでも、日常的に使っていないとすぐに忘れてしまう。

神経について。

しかし、そうではなく、無名の天才の魂のどこかに、他のアマチュアを犠牲にしてでも自分を主張したいという欲求があるのです。私は定期的に英語のフォーラムに書き込んでいますが、遭遇することはありません。だから、普段はあまり反応しないようにしているのだが、もしドミトリーが口喧嘩をしたければ、自分の発露の中に真っ逆さまに突っ込むという快挙をやってのける。

理由: