• <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>

               C++ 技術(shù)中心

               :: 首頁 :: 聯(lián)系 ::  :: 管理
              160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

            公告

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

            留言簿(27)

            搜索

            •  

            最新隨筆

            最新評(píng)論

            評(píng)論排行榜

            幾天前,在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)功能:( 不過我們?cè)贑++中至少可以繞彎解決,做到既能自動(dòng)記錄文件名和行號(hào),又能使用變長參數(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 通過。

            posted on 2013-08-19 11:03 C++技術(shù)中心 閱讀(1808) 評(píng)論(1)  編輯 收藏 引用 所屬分類: C++ 基礎(chǔ)

            Feedback

            # re: 可變參數(shù)[未登錄] 2013-08-20 13:05 xu
            此tracer的設(shè)計(jì)確實(shí)十分精妙!  回復(fù)  更多評(píng)論
              

            亚洲国产精品成人AV无码久久综合影院 | 久久午夜无码鲁丝片秋霞| 久久精品亚洲男人的天堂| 国产一区二区久久久| 无码人妻久久一区二区三区| 久久99久久99小草精品免视看| 美女写真久久影院| 三级三级久久三级久久| 久久久久人妻一区精品色| 精品多毛少妇人妻AV免费久久| 伊人久久大香线蕉av一区| 国产精品久久国产精品99盘 | 国产精品免费久久久久影院 | 无码人妻少妇久久中文字幕| 久久精品国产亚洲AV香蕉| 国产精品无码久久综合| 99久久精品无码一区二区毛片| 一本一道久久综合狠狠老| 久久精品成人免费网站| 亚洲精品乱码久久久久久中文字幕| 99精品久久久久久久婷婷| 色综合久久久久久久久五月| 香蕉99久久国产综合精品宅男自 | 国内精品免费久久影院| 色综合久久无码中文字幕| 无码任你躁久久久久久| 国内精品久久久久久久影视麻豆| 久久超乳爆乳中文字幕| 97久久国产综合精品女不卡| 欧美一级久久久久久久大| 久久国产香蕉一区精品| 97久久精品人人澡人人爽| 精品久久久久久成人AV| 精品无码久久久久国产| 无码久久精品国产亚洲Av影片| 久久久久亚洲AV成人网人人网站| 久久人妻少妇嫩草AV蜜桃| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 97久久超碰成人精品网站| 久久久久国产精品人妻| 亚洲伊人久久大香线蕉综合图片|