Что за # при форматировании с использованием%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.