青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

   C++ 技術中心

   :: 首頁 :: 聯系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

鄭重聲明:本BLOG所發表的原創文章,作者保留一切權利。必須經過作者本人同意后方可轉載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

留言簿(27)

搜索

  •  

最新隨筆

最新評論

評論排行榜

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

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

我猜樓主是想寫trace,如果不能使用可變參數的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標準支持Variadic Macros,在GCC中,可以這么寫:

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

還可以順便打印文件名和行號:

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

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

思路:寫一個重載了 operator() 的class,令 TRACE 宏返回該class的一個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 通過。

posted on 2013-08-19 11:03 C++技術中心 閱讀(1823) 評論(1)  編輯 收藏 引用 所屬分類: C++ 基礎

Feedback

# re: 可變參數[未登錄] 2013-08-20 13:05 xu
此tracer的設計確實十分精妙!  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品久久久久久久久免费樱桃| 99热这里只有精品8| 91久久中文字幕| 亚洲成人自拍视频| 亚洲国产日韩一区| 亚洲精品综合| 亚洲愉拍自拍另类高清精品| 欧美一区影院| 欧美国产视频在线| 亚洲精品免费在线播放| 亚洲欧洲综合另类| 99视频精品在线| 午夜精品久久久久| 久久久久久久一区二区三区| 欧美福利影院| 国产精品一区二区三区四区五区| 激情91久久| 亚洲精品久久在线| 午夜电影亚洲| 欧美激情欧美狂野欧美精品| 亚洲图片欧美午夜| 免费不卡在线视频| 国产精品美女主播在线观看纯欲| 在线播放国产一区中文字幕剧情欧美| 国产一区二区精品| 亚洲精品男同| 欧美在线3区| 欧美激情免费在线| 香港久久久电影| 欧美激情中文字幕一区二区| 国产精品男人爽免费视频1| 韩国久久久久| 亚洲永久精品大片| 亚洲第一主播视频| 午夜宅男久久久| 欧美日韩在线播放| 亚洲国产欧美一区| 久久精品国产亚洲aⅴ| 亚洲美女啪啪| 欧美jizz19hd性欧美| 国产亚洲欧美激情| 亚洲主播在线观看| 亚洲免费观看高清完整版在线观看熊 | 欧美韩日一区二区三区| 国产一区免费视频| 欧美一区二区三区免费大片| aaa亚洲精品一二三区| 欧美国产日韩视频| 亚洲激情视频| 欧美大片在线影院| 久色婷婷小香蕉久久| 国产一区亚洲| 久久久久五月天| 欧美一级大片在线免费观看| 国产欧美日韩一区二区三区在线观看 | 国产精品a久久久久| 日韩一级大片在线| 欧美成人首页| 久久精品欧洲| 精品成人一区二区三区| 久久青草福利网站| 久久久精品tv| 91久久线看在观草草青青| 欧美国产日韩一区二区在线观看 | 中文欧美在线视频| 国产精品成人在线观看| 在线综合+亚洲+欧美中文字幕| 亚洲国产精品一区二区尤物区| 久久久久久午夜| 亚洲破处大片| 99精品热视频| 国产精品伊人日日| 久久精视频免费在线久久完整在线看 | 中文在线资源观看网站视频免费不卡| 一道本一区二区| 亚洲一区影音先锋| 亚洲一二三四久久| 狠狠色综合网站久久久久久久| 免费影视亚洲| 欧美日韩国产在线| 午夜精品国产| 久久人人爽爽爽人久久久| 亚洲国产精品一区二区第一页| 亚洲国产第一| 国产精品免费区二区三区观看| 久久国产精品99国产精| 久久久999| 亚洲午夜电影| 久久精品99| 亚洲精品一区在线| 亚洲一区二区欧美| 亚洲福利电影| 亚洲一区国产一区| 伊人色综合久久天天| 日韩一级黄色片| 黄色av日韩| 一级成人国产| 亚洲国产精品嫩草影院| 亚洲自拍电影| 日韩午夜精品| 久久精品欧美日韩| 亚洲你懂的在线视频| 老牛嫩草一区二区三区日本 | 欧美精品在线播放| 久久电影一区| 欧美日韩成人综合天天影院| 久久精品午夜| 欧美网站在线观看| 欧美激情一区二区三区高清视频| 国产精品蜜臀在线观看| 亚洲欧洲日韩综合二区| 在线播放日韩欧美| 亚洲欧美日韩爽爽影院| 中日韩视频在线观看| 美女主播视频一区| 久久精品在线| 国产女主播一区| 亚洲图片在线观看| 一区二区三区www| 麻豆久久精品| 美女网站久久| 激情亚洲成人| 欧美一区二区三区在线视频| 午夜亚洲福利| 国产精品入口福利| 亚洲素人一区二区| 亚洲性色视频| 国产精品yjizz| 一区二区三区四区在线| 国产精品99久久不卡二区| 欧美激情免费在线| 亚洲国产一区二区视频| 亚洲精品美女久久久久| 男女激情久久| 亚洲激情图片小说视频| 亚洲人成人77777线观看| 免费在线一区二区| 亚洲激情视频在线观看| 欧美精品激情| 亚洲一区二区在线观看视频| 欧美日韩高清在线观看| 亚洲欧洲精品一区二区三区波多野1战4| 激情综合在线| 你懂的国产精品| 亚洲人成亚洲人成在线观看| 99精品免费视频| 欧美四级电影网站| 亚洲小视频在线观看| 欧美呦呦网站| 精品电影一区| 欧美极品在线观看| 夜夜嗨av一区二区三区网站四季av | 欧美肥婆在线| 日韩一级免费| 欧美天天影院| 欧美一区二区三区视频在线观看| 久久久精品国产免费观看同学 | 欧美午夜激情视频| 亚洲综合成人婷婷小说| 久久久天天操| 亚洲精品永久免费| 欧美涩涩视频| 久久成人资源| 日韩视频免费观看高清在线视频| 亚洲欧美www| 亚洲第一黄色| 欧美午夜欧美| 久久青草欧美一区二区三区| 亚洲精品免费一二三区| 欧美一区二区三区免费视频| 亚洲高清不卡在线观看| 欧美午夜视频网站| 久久久噜噜噜久久久| 在线一区二区三区做爰视频网站| 久久精品人人| 亚洲一区二区三区在线视频| 激情综合中文娱乐网| 欧美亚洲第一区| 美女精品在线观看| 亚洲免费小视频| 亚洲国产精品成人综合| 午夜一区二区三视频在线观看 | 一区二区三区国产精华| 狠狠色狠色综合曰曰| 国产精品99一区二区| 你懂的国产精品永久在线| 午夜久久黄色| 一区二区三区四区国产| 欧美高清视频一区二区| 久久久亚洲精品一区二区三区| 中日韩男男gay无套 | 亚洲乱码国产乱码精品精天堂| 国产欧美日韩视频一区二区三区| 欧美精品 国产精品| 久久天天躁夜夜躁狠狠躁2022 | 欧美精品videossex性护士| 久久精品国产999大香线蕉| 亚洲无人区一区| 国产精品成人在线观看| 亚洲一二三四区|