• <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>
            隨筆 - 45  文章 - 129  trackbacks - 0
            <2007年1月>
            31123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            專注于C++ P2P STL GP OpenSource等
            Google

            常用鏈接

            留言簿(10)

            隨筆分類

            隨筆檔案

            相冊

            朋友

            • .NET

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            先講#和#@字符:這兩個比較類似:前者是將所代表的東西字符串化,后者是將代表的東西字符化。

            而##可以說是個符號粘合劑。(Modern C++中用來做編譯時期內(nèi)存檢查--2.1節(jié) 就是用了這個符號)

            #的用法

            The number-sign or "stringizing" operator (#) converts macro parameters (after expansion) to string constants. It is used only with macros that take arguments. If it precedes a formal parameter in the macro definition, the actual argument passed by the macro invocation is enclosed in quotation marks and treated as a string literal. The string literal then replaces each occurrence of a combination of the stringizing operator and formal parameter within the macro definition.

            White space preceding the first token of the actual argument and following the last token of the actual argument is ignored. Any white space between the tokens in the actual argument is reduced to a single white space in the resulting string literal. Thus, if a comment occurs between two tokens in the actual argument, it is reduced to a single white space. The resulting string literal is automatically concatenated with any adjacent string literals from which it is separated only by white space.

            Further, if a character contained in the argument usually requires an escape sequence when used in a string literal (for example, the quotation mark (") or backslash (\) character), the necessary escape backslash is automatically inserted before the character. The following example shows a macro definition that includes the stringizing operator and a main function that invokes the macro:

            #define stringer( x ) printf( #x "\n" )
            
            int main()
            {
                stringer( In quotes in the printf function call\n ); 
                stringer( "In quotes when printed to the screen"\n );   
                stringer( "This: \"  prints an escaped double quote" );
            }

            Such invocations would be expanded during preprocessing, producing the following code:

            int main()
            {
               printf( "In quotes in the printf function call\n" "\n" );
               printf( "\"In quotes when printed to the screen\"\n" "\n" );
               printf( "\"This: \\\" prints an escaped double quote\"" "\n" );
            }

            When the program is run, screen output for each line is as follows:

            In quotes in the printf function call
            
            "In quotes when printed to the screen"
            
            "This: \" prints an escaped double quotation mark"

            Microsoft Specific

            The Microsoft C (versions 6.0 and earlier) extension to the ANSI C standard that previously expanded macro formal arguments appearing inside string literals and character constants is no longer supported. Code that relied on this extension should be rewritten using the stringizing (#) operator.

            END Microsoft Specific

            #@的用法


            Microsoft Specific

            The charizing operator can be used only with arguments of macros. If #@ precedes a formal parameter in the definition of the macro, the actual argument is enclosed in single quotation marks and treated as a character when the macro is expanded. For example:

            #define makechar(x)  #@x

            causes the statement

            a = makechar(b);

            to be expanded to

            a = 'b';

            The single-quotation character cannot be used with the charizing operator.

            END Microsoft Specific

            ##的用法

            The double-number-sign or "token-pasting" operator (##), which is sometimes called the "merging" operator, is used in both object-like and function-like macros. It permits separate tokens to be joined into a single token and therefore cannot be the first or last token in the macro definition.

            If a formal parameter in a macro definition is preceded or followed by the token-pasting operator, the formal parameter is immediately replaced by the unexpanded actual argument. Macro expansion is not performed on the argument prior to replacement.

            Then, each occurrence of the token-pasting operator in token-string is removed, and the tokens preceding and following it are concatenated. The resulting token must be a valid token. If it is, the token is scanned for possible replacement if it represents a macro name. The identifier represents the name by which the concatenated tokens will be known in the program before replacement. Each token represents a token defined elsewhere, either within the program or on the compiler command line. White space preceding or following the operator is optional.

            This example illustrates use of both the stringizing and token-pasting operators in specifying program output:

            #define paster( n ) printf( "token" #n " = %d", token##n )
            int token9 = 9;

            If a macro is called with a numeric argument like

            paster( 9 );

            the macro yields

            printf( "token" "9" " = %d", token9 );

            which becomes

            printf( "token9 = %d", token9 );
            posted on 2007-01-19 14:03 CPP&&設(shè)計(jì)模式小屋 閱讀(1624) 評論(1)  編輯 收藏 引用 所屬分類: 其他

            FeedBack:
            # re: 關(guān)于 ## ,#以及#@的用法 2007-04-21 18:47 heweitykc
            c++整的這么復(fù)雜啊 以后怎么維護(hù)啊!  回復(fù)  更多評論
              
            久久青青草原精品国产不卡| 亚洲精品乱码久久久久久自慰| 97精品久久天干天天天按摩| 久久青青草原国产精品免费| 久久午夜综合久久| 亚洲精品无码久久久影院相关影片| 99re这里只有精品热久久| 亚洲国产成人久久精品99| 五月丁香综合激情六月久久| 国产精品亚洲美女久久久| 亚洲午夜久久久久久噜噜噜| 久久被窝电影亚洲爽爽爽| AV无码久久久久不卡蜜桃| 激情久久久久久久久久| 无遮挡粉嫩小泬久久久久久久| 久久精品国产只有精品66 | 久久A级毛片免费观看| 日韩中文久久| 久久香蕉一级毛片| 亚洲狠狠婷婷综合久久久久| 久久中文字幕视频、最近更新| 国产Av激情久久无码天堂 | 久久精品中文无码资源站| 精品国产一区二区三区久久| 久久亚洲精品国产精品| 亚洲精品无码久久久| 大蕉久久伊人中文字幕| 久久美女人爽女人爽| 久久免费国产精品一区二区| 久久精品国产亚洲AV忘忧草18| 狠狠狠色丁香婷婷综合久久五月| 久久久久亚洲AV无码专区首JN | 77777亚洲午夜久久多人| 久久亚洲AV无码西西人体| 国产呻吟久久久久久久92| 爱做久久久久久| 超级碰久久免费公开视频| 久久精品国产99久久久香蕉 | 午夜精品久久影院蜜桃| 中文成人无码精品久久久不卡| 久久综合久久综合亚洲|