Opérateur d'enchaînement (#)
Le signe dièse ou opérateur de « chaîne » (#) convertit des paramètres de macro en littéraux de chaîne sans développer la définition des paramètres. Il est utilisé uniquement avec les macros qui acceptent des arguments. S'il précède un paramètre formel dans la définition de la macro, l'argument réel passé par l'appel de macro est entre guillemets et traité en tant que littéral de chaîne. Le littéral de chaîne remplace alors chaque occurrence d'une combinaison de l'opérateur de chaîne et du paramètre formel dans la définition de macro.
Notes
L'extension Microsoft C (versions 6.0 et antérieures) de la norme C ANSI, qui développait auparavant les arguments formels de macro apparaissant dans les littéraux de chaîne et les constantes caractère, n'est plus prise en charge.Le code qui reposait sur cette extension doit être réécrit à l'aide de l'opérateur de chaîne (#).
L'espace blanc qui précède le premier jeton de l'argument réel ou qui suit le dernier jeton de l'argument réel est ignoré. Tout espace blanc situé entre les jetons dans l'argument réel est réduit à un espace blanc unique dans le littéral de chaîne résultant. Ainsi, si un commentaire figure entre deux jetons de l'argument réel, il est réduit à un espace blanc unique. Le littéral de chaîne résultant est automatiquement concaténé avec tous les littéraux de chaîne adjacents dont il est séparé uniquement par un espace blanc.
De plus, si un caractère inclus dans l'argument requiert généralement une séquence d'échappement lorsqu'il est utilisé dans un littéral de chaîne (par exemple, un guillemet (") ou une barre oblique inverse (\)), la barre oblique inverse d'échappement requise est automatiquement insérée avant ce caractère.
L'opérateur de chaîne Visual C++ peut ne pas fonctionner comme prévu dans toutes les situations. Consultez 16.3.2 Opérateur # pour plus d'informations.
Exemple
L'exemple ci-dessous illustre une définition de macro incluant l'opérateur de chaîne et une fonction principale qui appelle la macro :
Ces appels sont développés pendant le prétraitement et génèrent le code suivant :
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" );
}
L'exemple suivant montre comment développer un paramètre de macro :
// 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)