Что за # при форматировании с использованием% s - PullRequest
5 голосов
/ 18 марта 2011

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

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

Ответы [ 7 ]

9 голосов
/ 18 марта 2011

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

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

#define ASSERT(x) #x

ASSERT(a b c d)
// is replaced by
"a b c d"
4 голосов
/ 18 марта 2011

#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
}
3 голосов
/ 18 марта 2011

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

2 голосов
/ 18 марта 2011

# - оператор строкового определения, определенный в разделе 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".

2 голосов
/ 18 марта 2011

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

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

1 голос
/ 18 марта 2011

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

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

0 голосов
/ 18 марта 2011

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

...