Zeichenfolgenoperator (#)
Der Operator "number-sign" oder "stringizing" (#) konvertiert Makroparameter in Zeichenfolgenliterale, ohne die Parameterdefinition zu erweitern. Es wird nur für Makros verwendet, die Argumente annehmen. Wenn er einem formalen Parameter in der Makrodefinition voransteht, ist das tatsächliche Argument, das vom Makroaufruf übergeben wird, in Anführungszeichen eingeschlossen und wird als Zeichenfolgenliteral behandelt. Das Zeichenfolgenliteral ersetzt dann jedes Vorkommen einer Kombination des Zeichenfolgenoperators und des formalen Parameters innerhalb der Makrodefinition.
Hinweis
Die Erweiterung von Microsoft C (Version 6.0 und früher) für den ANSI C-Standard, die bisher formale Makroargumente in Zeichenfolgenliteralen und Zeichenkonstanten erweiterte, wird nicht mehr unterstützt. Code, der auf dieser Erweiterung basiert, sollte mithilfe des Zeichenfolgenoperators (#) neu geschrieben werden.
Leerzeichen, die vor dem ersten Token stehen und dem letzten Token des tatsächlichen Arguments folgen, werden ignoriert. Jedes Leerzeichen zwischen den Token im tatsächlichen Argumente wird im resultierenden Zeichenfolgenliteral auf ein einzelnes Leerzeichen reduziert. Wenn also ein Kommentar zwischen zwei Token im tatsächlichen Argument auftritt, wird er auf ein einzelnes Leerzeichen reduziert. Das resultierende Zeichenfolgenliteral wird automatisch mit benachbarten Zeichenfolgenliteralen verkettet, die nur durch Leerzeichen getrennt sind.
Wenn ein im Argument enthaltenes Zeichen in der Regel eine Escapesequenz erfordert, wenn sie in einem Zeichenfolgenliteral verwendet wird, z. B. das Anführungszeichen ("
) oder umgekehrter Schrägstrich (\
) wird der erforderliche Escape-Umgekehrtslass automatisch vor dem Zeichen eingefügt.
Der Microsoft C++-Zeichenfolgenoperator verhält sich nicht ordnungsgemäß, wenn er mit Zeichenfolgen verwendet wird, die Escapesequenzen enthalten. In dieser Situation generiert der Compiler Compilerfehler C2017.
Beispiele
Das folgende Beispiel zeigt eine Makrodefinition, die den Zeichenfolgenoperator enthält, und eine Hauptfunktion, die das Makro aufruft:
// stringizer.cpp
#include <stdio.h>
#define stringer( x ) printf_s( #x "\n" )
int main() {
stringer( In quotes in the printf function call );
stringer( "In quotes when printed to the screen" );
stringer( "This: \" prints an escaped double quote" );
}
Die stringer
Makros werden während der Vorverarbeitung erweitert, wodurch der folgende Code erzeugt wird:
int main() {
printf_s( "In quotes in the printf function call" "\n" );
printf_s( "\"In quotes when printed to the screen\"" "\n" );
printf_s( "\"This: \\\" prints an escaped double quote\"" "\n" );
}
In quotes in the printf function call
"In quotes when printed to the screen"
"This: \" prints an escaped double quote"
Das folgende Beispiel zeigt, wie ein Makroparameter erweitert werden kann:
// stringizer_2.cpp
// compile with: /E
#define F abc
#define B def
#define FB(arg) #arg
#define FB1(arg) FB(arg)
FB(F B)
FB1(F B)