Zeichenfolgenoperator (#)
Der Nummernzeichen- oder Zeichenfolgenoperator (#) konvertiert Makroparameter in Zeichenfolgenliterale, ohne die Parameterdefinition zu erweitern. Er wird nur mit Makros verwendet, die Argumente akzeptieren. 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 diese Erweiterung baute, sollte mithilfe des Zeichenfolgenoperators (#) umgeschrieben werden.
Das Leerzeichen vor dem ersten Token des tatsächlichen Arguments und nach dem letzten Token des tatsächlichen Arguments wird 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 das Leerzeichen auf einen einzelnes Leerzeichen reduziert. Das sich ergebende Zeichenfolgenliteral wird automatisch mit allen angrenzenden Zeichenfolgenliteralen verkettet, von denen es nur durch ein Leerzeichen getrennt ist.
Wenn darüber hinaus ein Zeichen, das im Argument enthalten ist, normalerweise eine Escapesequenz erfordert, wenn es in einem Zeichenfolgenliteral verwendet wird (z. B. das Anführungszeichen (") oder der umgekehrte Schrägstrich (\)), wird das erforderliche Escapezeichen automatisch vor dem Zeichen eingefügt.
Der Zeichenfolgenoperator von Visual C++ verhält sich nicht in allen Fällen erwartungsgemäß. Weitere Informationen finden Sie unter 16.3.2 Der #-Operator.
Beispiel
Das folgende Beispiel zeigt eine Makrodefinition, welche den Zeichenfolgenoperator und eine Hauptfunktion umfasst, die das Makro aufruft:
Solche Aufrufe würden während der Vorverarbeitung erweitert und den folgenden Code ergeben:
int main() {
printf_s( "In quotes in the printf function call\n" "\n" );
printf_s( "\"In quotes when printed to the screen\"\n" "\n" );
printf_s( "\"This: \\\" prints an escaped double quote\"" "\n" );
}
// 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" );
}
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)