Что за # при форматировании с использованием%s

Я наткнулся на этот пример утверждения и мне было интересно, что # для:

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

7 ответов

Это оператор предварительной обработки stringize.

Он принимает токены, переданные в качестве аргумента параметра макроса x и превращает их в строковый литерал.

#define ASSERT(x) #x

ASSERT(a b c d)
// is replaced by
"a b c d"

#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
}

# является оператором "stringizing" препроцессора. Превращает параметры макроса в строковые литералы. Если вы позвонили ASSERT(foo >= 32) #x расширен до "foo >= 32" во время оценки макроса.

Это функция препроцессора, называемая stringification. Это

заменяет [параметр макроса] литеральным текстом фактического аргумента, преобразованного в строковую константу.

# является оператором строки, определенным в Разделе 6.10.3.2 (C99) и в Разделе 16.3.2. (C++03)

Он преобразует макропараметры в строковые литералы без расширения определения параметра.

Если полученная замена не является допустимым символьным строковым литералом, поведение не определено. Порядок вычисления оператора # не указан.

Например, синтаксически вхождения символа обратной косой черты в строковых литералах ограничены escape-последовательностями.

В следующем примере:

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

результат # оператор не должен быть "a \ b",

Это строковый оператор.

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

То, что вы видите, называется струнификацией. Это позволяет вам преобразовать аргумент макроса в строковый литерал. Вы можете прочитать больше об этом здесь http://gcc.gnu.org/onlinedocs/cpp/Stringification.html.

Другие вопросы по тегам