zoukankan      html  css  js  c++  java
  • Token-Pasting Operator (##) and Stringizing Operator (#)

    Token-Pasting Operator (##)
    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 );


    Stringizing Operator (#)

    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 " " )

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

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

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

    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"

  • 相关阅读:
    IEC61850标准化逻辑节点组
    获取类成员函数地址和通过成员函数地址调用对应成员函数
    [转]什么是差动保护
    IEC61850概述
    window下使用mingw编译vlc2.1.0git
    Code::Blocks集成Cygwin的使用
    [STL] 注意erase() 和remove()
    C# 调用C++DLL传递指向指针的指针参数的方法
    Boost的使用相关
    在window下qt开发环境
  • 原文地址:https://www.cnblogs.com/Key-Ky/p/6341561.html
Copyright © 2011-2022 走看看