Estou tentando entender os detalhes essenciais de como funciona o pré-processador C++.
Suponha que temos:
#define LP (
#define F(X) a
O código a seguir é pré-processado para a
:
#define G1(Y) F Y
G1(LP) 1 )
No entanto, o código a seguir é pré-processado para F ( 1 )
:
#define G2(Y) F LP
G2(LP) 1 )
Ok, acho que isso faz sentido se o LP
argumento já estiver expandido no momento em que é inserido na macro.
Exceto, esse não é o caso! O código a seguir é pré-processado para F "LP" 1 )
, não F "(" 1 )
:
#define G3(Y) F #Y
G3(LP) 1 )
Ok, agora estou confuso. Quais são as regras por trás quando um parêntese aberto é tratado como o início de uma invocação de macro semelhante a uma função?
O pré-processador C++ considera o arquivo feito de group-parts . Esta regra é definida da seguinte forma:
- [cpp.pre]
É por isso que
#define Z ()
não definiria uma macro semelhante a uma função, mas sim,#define Z()
por exemplo.O pré-processador elimina a separação de espaços em branco ao expandir macros, portanto,
F Y
ondeY
a expansãoLP )
é tratada comoF()
. A expansão de macros semelhantes a funções é descrita em [cpp.subst] p1 .A razão pela qual
F #Y
se comporta de maneira diferente é que [cpp.subst] isenta#Y
da substituição de macro e, em vez disso, o#
operador é aplicado, o que significa que- [cpp.stringize] p2
No seu exemplo,
#Y
ondeY
se expande para"LP"
, porqueLP
é a grafia original do argumento.