Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

357
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!