欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

變長(zhǎng)參數(shù)的 Tracer

系統(tǒng) 1981 0

幾天前,在CSDN論壇看到這么一則討論: 在宏定義中怎么使用可變參數(shù)? ( http://expert.csdn.net/Expert/topic/2925/2925165.xml )。樓主希望能定義這樣的macro:

#define fun1(a, b, ...)?? fun2(__FILE__, __LINE__, a, b, ...)

我猜樓主是想寫trace,如果不能使用可變參數(shù)的macro,那么就得像MFC那樣寫一堆TRACE macros:


// 取自 MFC 7.1 的 afx.h
// The following trace macros are provided for backward compatiblity
//? (they also take a fixed number of parameters which provides
//?? some amount of extra error checking)
#define TRACE0(sz)???????????????TRACE(_T("%s"), _T(sz))
#define TRACE1(sz, p1)????????? ?TRACE(_T(sz), p1)
#define TRACE2(sz, p1, p2)????? ?TRACE(_T(sz), p1, p2)
#define TRACE3(sz, p1, p2, p3)? ?TRACE(_T(sz), p1, p2, p3)

太丑陋了!還好,C99標(biāo)準(zhǔn)支持Variadic Macros,在GCC中,可以這么寫:

// http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html
#define debug(format, ...)? fprintf(stderr, format, __VA_ARGS__)

還可以順便打印文件名和行號(hào):

#define debug(format, ...)? do {\
??????????????? fprintf(stderr, "%s (%d): ", __FILE__, __LINE__);\
??????????????? fprintf(stderr, format, __VA_ARGS__);\
??????????????? } while (0)

但可惜Visual C++ 7.1還不支持這項(xiàng)功能:( 不過(guò)我們?cè)贑++中至少可以繞彎解決,做到 既能自動(dòng)記錄文件名和行號(hào),又能使用變長(zhǎng)參數(shù)調(diào)用 。這個(gè)辦法不是我獨(dú)創(chuàng)的,實(shí)際上ATL的 atltrace.h 中就有它的實(shí)現(xiàn)( CtraceFileAndLineInfo class),我在Code Project也找到了相同的實(shí)現(xiàn)( http://www.codeproject.com/debug/location_trace.asp ),甚至在CUJ的C++ Experts Forum 也能看到相近的做法( http://www.cuj.com/documents/s=8250/cujcexp2106alexandr/ ),當(dāng)然Alexandrescu的辦法技巧性更強(qiáng)。

思路:寫一個(gè)重載了 operator() 的class,令 TRACE 宏返回該class的一個(gè)object:

#include
#include

#ifndef NDEBUG? // debug mode

class tracer
{
public:
? tracer(const char* file, int line)
??? : file_(file), line_(line)
? {}
?
? void operator() ( const char* fmt, ... )
? {
??? va_list ap;
???
??? // print the file name and line number
??? fprintf(stderr, "%s (%d): ", file_, line_);
???
??? va_start(ap, fmt);
??? vfprintf(stderr, fmt, ap);
??? va_end(ap);
???
??? fprintf(stderr, "\r\n"); // print the new-line character
? }

private:
? // copy-ctor and operator=
? tracer(const tracer&);
? tracer& operator=(const tracer&);

private:
? const char* file_;
? int???????? line_;
};
#define TRACE (tracer(__FILE__, __LINE__))
#else? // NDEBUG
#define TRACE (void)
#endif // NDEBUG

int main()
{
#ifndef NDEBUG
? tracer(__FILE__, __LINE__)("%x", 123);
#endif

? TRACE("%s", "Happy debugging.");
}

這樣做是multithreading-safe的。G++ 3.3.1 / Visual C++ 7.1 / Borland C++ 5.5.1 通過(guò)。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=565


變長(zhǎng)參數(shù)的 Tracer


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 一级毛片一级毛片一级毛片 | 成人免费观看网欧美片 | 奇米亚洲 | 男女做性无遮挡免费视频 | 毛片免费一区二区三区 | 国产精品色 | 欧美高清国产 | 狠狠久 | 国产精品视频 | 日韩欧美一区二区三区不卡 | 免费观看黄的小视频 | 成人免费毛片在线观看 | 国产自产视频 | 在线观看av网站永久 | 91操美女| 亚洲 欧美 日韩 在线 | 无主之花在线观看 | 最新欧美精品一区二区三区 | 国产精品永久免费视频观看 | 日本黄色小视频在线观看 | 国产成人精品影院狼色在线 | 国产精品成人一区二区 | 久久久久久免费免费 | 欧美日色 | 亚洲经典激情春色另类 | 国产欧美日本亚洲精品五区 | 六月综合激情 | 日韩在线视频观看 | 大片免费看费看大片 | 国产一级免费在线视频 | 黄色尤物| 成人网在线 | 香港全黄一级毛片在线播放 | 欧美精品无需播放器在线观看 | 激情六月天 | 欧美日韩高清一区 | 欧美日韩乱| 天天色天天射天天干 | 日韩欧美二区 | 成人免费在线视频网站 | 国产激情 |