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

345
Visualizações
¿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 Respostas
Responde à pergunta

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 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