4

TRACE情報を表示する簡単なマクロを書いています。

これは私が使用しているものです、

#ifdef __DEBUG__
#define TRACE  { PrintErrorMsg("Trace exception at " __FILE__  "LineNo:"##(__LINE__) "Function: " __FUNCTION__ " " );}
#else 
#define TRACE 
#endif

これはFILEで機能していますが、 LINEでは機能していないようです。どうすればこれに対処できますか。私はすでに文字列演算子も試しました。これは次のとおりです。

#ifdef __DEBUG__
#define TRACE  { PrintErrorMsg("Trace exception at " __FILE__  "LineNo:"#(__LINE__) "Function: " __FUNCTION__ " " );}
#else 
#define TRACE 
#endif

および parms なしで double parms を使用する場合、ex-__LINE__または((__LINE__)) この問題にどのように対処できますか?

そして、私はこれを思いつきます、

#ifdef __DEBUG__
#define ERROR_MSG_BUF_SIZE 1024
#define TRACE  { char * error_msg_buffer = new char[ERROR_MSG_BUF_SIZE]; \
                 sprintf(error_msg_buffer,"Trace Exception at file: %s ,Line : %d , Function %s \n",__FILE__,__LINE__,__FUNCTION__);\
PrintErrorMsg(error_msg_buffer );\
delete[] error_msg_buffer;}
#else 
#define TRACE 

しかし、 sprintf を使用せずに、文字列とトークンの貼り付けだけでやりたいです。何か案が?

#endif

- 前もって感謝します -

4

2 に答える 2

16

で何かを文字列化しようとする場合#x、それxはマクロパラメータである必要があります。

#define FOO #__LINE__ /* this is not okay */
#define BAR(x) #x     /* this is okay */

ただし、単純に言うことはできませんBAR(__LINE__)。これにより、トークンがに渡さ__LINE__BAR、拡張せずにすぐに文字列に変換され(これは仕様によるものです)、が与えられ"__LINE__"ます。トークン貼り付け演算子でも同じことが##起こります。オペランドの展開は決して起こりません。

解決策は、間接参照を追加することです。これらは常にコードベースのどこかにあるはずです。

#define STRINGIZE(x) STRINGIZE_SIMPLE(x)
#define STRINGIZE_SIMPLE(x) #x

#define CONCAT(first, second) CONCAT_SIMPLE(first, second)
#define CONCAT_SIMPLE(first, second) first ## second

ここで、(たとえば)に完全に展開されることになりSTRINGIZE(__LINE__)、結果は「123」になります。ふぅ!私は元の振る舞いをしたいというオフチャンスを残します。したがって、コードは次のようになります。STRINGIZE_SIMPLE(__LINE__)#123STRINGIZE_SIMPLE

#include <iostream>

#define STRINGIZE(x) STRINGIZE_SIMPLE(x)
#define STRINGIZE_SIMPLE(x) #x

#define TRACE()                                                 \
        PrintErrorMsg("Trace exception in " __FILE__            \
                      " at line number " STRINGIZE(__LINE__)    \
                      " in function " __FUNCTION__ ".")

void PrintErrorMsg(const char* str)
{
    std::cout << str << std::endl;
}

int main()
{
    TRACE();
}
于 2012-11-09T03:19:14.857 に答える
6

残念ながら、この種の愚かさが必要です。

#include <stdio.h>

#define TRACE2(f,l) printf("I am at file: " f " and line: " #l "\n")
#define TRACE1(f,l) TRACE2(f,l)
#define TRACE() TRACE1(__FILE__, __LINE__)

int main(void)
{
    TRACE();
    TRACE();
}

私はファイルにいます: test.cpp と行: 9
私はファイルにいます: test.cpp と行: 10

于 2012-11-09T03:14:56.920 に答える