Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

344
Vistas
¿Preprocesamiento C de dos pasos?

¿Hay alguna manera de hacer que el preprocesador C (GCC) ejecute dos pases para expandir completamente las macros?

Estoy tratando de definir macros que admitan E/S de puerto en un microcontrolador usando nombres abstractos para pines:

 #define LED_RED E, (1<<6) #define SetPin(port, mask) PORT ## port ## SET = (mask) #define ClearPin(port, mask) PORT ## port ## CLR = (mask) #define ReadPin(port, mask) (PORT ## port) & (mask)

Luego en mi código:

 SetPin(LED_RED); ClearPin(LED_RED); result = ReadPin(LED_RED);

Esto está destinado a expandirse a:

 PORTESET = (1<<6); PORTECLR = (1<<6); result = (PORTE) & (1<<6);

Esto no se compila, obtengo:

error: la macro "SetPin" requiere 2 argumentos, pero solo se proporciona 1.

Aunque esto compila y funciona bien:

 SetPin(E, (1<<6));

Entonces... ¿cómo hacer que el compilador de C expanda completamente estas macros?

O, si no es eso, ¿cómo hacer que este tipo de cosas funcionen?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Tienes que pasar los argumentos a través de una macro adicional.

 #define LED_RED E, (1<<6) #define SetPin2(port, mask) PORT ## port ## SET = (mask) #define SetPin(x) SetPin2(x) SetPin(LED_RED);

Esto se debe al orden de reemplazo de macros:

  1. Primero, se identifican los argumentos de una macro similar a una función. Esto ya falla si la cantidad de argumentos es incorrecta (como en su código).
  2. Luego, los tokens de argumento se colocan en la lista de reemplazo. A menos que estén al lado de ## o # , se macroexpanden antes.
  3. Finalmente, la lista de reemplazo resultante se escanea en busca de más reemplazos de macros.

Con la macro adicional "en el medio", el segundo paso tiene la oportunidad de reemplazar LED_RED .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda