5

私はこのアサーションの例に出くわし、それが何の#ためにあるのか疑問に思いました。

#define ASSERT( x ) if ( !( x ) ) { \
    int *p = NULL; \
    DBGPRINTF("Assert failed: [%s]\r\n Halting.", #x); \
    *p=1; \
  } 
4

7 に答える 7

9

これは「文字列化」前処理演算子です。

マクロパラメータへの引数として渡されたトークンを受け取り、xそれらを文字列リテラルに変換します。

#define ASSERT(x) #x

ASSERT(a b c d)
// is replaced by
"a b c d"
于 2011-03-18T16:01:05.213 に答える
4

#x文字列化ディレクティブです

#define Stringify(x) #x

手段 Stringify(abc)はに置き換えられます"abc"

のように

#define initVarWithItsOwnName(x) const char* p = #x

int main()
{
   initVarWithItsOwnName(Var);
   std::cout << Var; //will print Var
}
于 2011-03-18T16:01:01.397 に答える
3

#プリプロセッサの「文字列化」演算子です。マクロパラメータを文字列リテラルに変換します。ASSERT(foo >= 32)呼び出した場合は、マクロの評価中にに#x展開されます。"foo >= 32"

于 2011-03-18T16:01:16.973 に答える
2

#セクション6.10.3.2(C99)およびセクション16.3.2で定義されている文字列化演算子です。(C ++ 03)

パラメータ定義を拡張せずに、マクロパラメータを文字列リテラルに変換します。

結果として生じる置換が有効な文字列リテラルでない場合、動作は未定義です。#演算子の評価の順序は指定されていません。

たとえば、構文的には、文字列リテラルでの円記号の出現はエスケープシーケンスに制限されます。

次の例では:

1        #define  mkstr(x)  #  x
2        char  *p  =  mkstr(a  \  b);  
       /*  "a  \  b"  violates  the  syntax  of  string  literals  */

演算子の結果はである#必要はありません"a \ b"

于 2011-03-18T16:04:59.667 に答える
2

これは、文字列化と呼ばれるプリプロセッサ機能です。それ

[マクロパラメータ]を、文字列定数に変換された実際の引数のリテラルテキストに置き換えます。

于 2011-03-18T16:01:23.057 に答える
1

これは文字列化演算子です。

http://msdn.microsoft.com/en-us/library/7e3a913x(v=vs.80).aspx

于 2011-03-18T16:03:21.303 に答える
0

あなたが見るものは文字列化と呼ばれます。マクロの引数を文字列リテラルに変換できます。詳細については、 http: //gcc.gnu.org/onlinedocs/cpp/Stringification.htmlを参照してください。

于 2011-03-18T16:03:39.177 に答える