Alors que d'un pré-processeur de macro est en cours d'expansion, cette macro est le nom n'est pas élargi. Donc, tous les trois de vos symboles sont définis comme eux-mêmes:
ONE -> TWO -> THREE -> ONE (not expanded because expansion of ONE is in progress)
TWO -> THREE -> ONE -> TWO ( " TWO " )
THREE -> ONE -> TWO -> THREE ( " THREE " )
Ce comportement est défini par le §6.10.3.4 de la norme (le numéro de la section de la C11 projet, bien que, autant que je sache, le libellé et la numérotation de l'article est inchangé depuis C89). Quand un nom de macro est rencontré, il est remplacé par sa définition (et #
et ##
préprocesseur opérateurs sont traitées, ainsi que les paramètres de la fonction-comme les macros). Le résultat est à nouveau analysés pour plus de macros (dans le contexte du reste du fichier):
2/ Si le nom de la macro de remplacement est trouvé au cours de cette analyse de la liste de remplacement (pas y compris le reste du fichier source du prétraitement des jetons), il n'est pas remplacé. En outre, si toutes les remplacements de rencontrer le nom de la macro d'être remplacé, il n'est pas remplacé...
La clause revient à dire que n'importe quel jeton qui n'est pas remplacé en raison d'un appel récursif est effectivement "surgelés": il ne sera jamais remplacé:
... Ces nonreplaced nom de la macro de prétraitement des jetons ne sont plus disponible pour d'autres de remplacement, même si ils sont plus tard (ré)examinée dans des contextes dans lequel le nom de la macro de prétraitement jeton aurait autrement été remplacé.
La situation à la dernière phrase se réfère rarement dans la pratique, mais ici, c'est le cas le plus simple je pense:
#define two one,two
#define a(x) b(x)
#define b(x,y) x,y
a(two)
Le résultat est one, two
. two
est élargi à d' one,two
pendant le remplacement d' a
, ainsi que l'élargissement two
est marqué comme complètement étendu. Par la suite, b(one,two)
est élargi. Ce n'est plus dans le contexte de la substitution d' two
, mais l' two
qui est le deuxième argument de b
a été gelé, il n'est pas développé à nouveau.