Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

351
Visualizações
¿Por qué GCC elimina los espacios en blanco entre los tokens de preprocesamiento?

Código de muestra:

 #define X(x,y) xy #define STR_(x) #x #define STR(x) STR_(x) STR(X(Y,Y))

Invocaciones:

 $ gcc t222.c -std=c11 -pedantic -Wall -Wextra -E -P "Y Y" $ gcc t222.c -std=c11 -pedantic -Wall -Wextra -E -P -D"Y()" "YY"

¿Por qué GCC elimina los espacios en blanco entre los tokens de preprocesamiento?

Por ejemplo, clang no:

 $ clang t222.c -std=c11 -pedantic -Wall -Wextra -E -P -D"Y()" "Y Y"

UPD1. De alguna manera gcc tiene en cuenta el espacio en blanco entre , Y :

 $ gcc t222.c -std=c11 -pedantic -Wall -Wextra -E -P -D"Y()" -D"Z=STR(X(Y,Y))" "YY" $ gcc t222.c -std=c11 -pedantic -Wall -Wextra -E -P -D"Y()" -D"Z=STR(X(Y, Y))" "Y Y"

UPD2. Este:

 STR(X(Y, Y))

lleva a:

 $ gcc t222.c -std=c11 -pedantic -Wall -Wextra -E -P -D"Y()" "Y Y"

Sin embargo, esto:

 STR(X(Y ,Y))

lleva a:

 $ gcc t222.c -std=c11 -pedantic -Wall -Wextra -E -P -D"Y()" "YY"

UPD3. Reportado: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104147 .

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Este es un error en GCC. C 2018 6.10.3.2 especifica el comportamiento del operador # . El párrafo 1 dice: "Cada # token de preprocesamiento en la lista de reemplazo para una macro similar a una función debe ser seguido por un parámetro como el siguiente token de preprocesamiento en la lista de reemplazo". Vemos esto en el #x de #define STR_(x) #x .

El párrafo 2 dice:

Si, en la lista de reemplazo, un parámetro está inmediatamente precedido por un token de preprocesamiento # , ambos se reemplazan por un token de preprocesamiento literal de cadena de un solo carácter que contiene la ortografía de la secuencia del token de preprocesamiento para el argumento correspondiente. Cada aparición de un espacio en blanco entre los tokens de preprocesamiento del argumento se convierte en un carácter de espacio único en el literal de la cadena de caracteres. Se elimina el espacio en blanco antes del primer token de preprocesamiento y después del último token de preprocesamiento que componen el argumento...

La invocación de la macro X(Y,Y) debe haber dado como resultado los tokens Y e Y , y vemos en #define X(x,y) xy que tendrían un espacio en blanco entre ellos.

El espacio en blanco en una lista de reemplazo de macros es significativo, según 6.10.3 1, que dice:

Dos listas de reemplazo son idénticas si y solo si los tokens de preprocesamiento en ambas tienen el mismo número, orden, ortografía y separación de espacios en blanco, donde todas las separaciones de espacios en blanco se consideran idénticas.

Por lo tanto, en #define X(x,y) xy , la lista de reemplazo no debe considerarse como solo los dos tokens x e y , sin tener en cuenta los espacios en blanco. La lista de reemplazo es x , espacio en blanco e y .

Además, cuando se reemplaza la macro, se reemplaza por la lista de reemplazo (y, por lo tanto, incluye espacios en blanco), no solo por los tokens en la lista de reemplazo, según 6.10.3 10:

… Cada instancia subsiguiente del nombre de macro similar a una función seguido de un ( como el siguiente token de preprocesamiento introduce la secuencia de tokens de preprocesamiento que se reemplaza por la lista de reemplazo en la definición (una invocación de la macro)… Dentro de la secuencia de tokens de preprocesamiento Al crear una invocación de una macro similar a una función, la nueva línea se considera un carácter de espacio en blanco normal.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda