0Pricing
C Academy · Aula

Compilação condicional

ifdef e macros.

Compilação condicional é uma aula grátis de C Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C Academy inclui 4 aulas no total.

O pré-processador

Antes mesmo de o compilador ver seu código, o pré-processador é executado. Ele processa toda linha que começa com #: inclusões, macros e condicionais.

A compilação condicional permite incluir ou excluir blocos de código com base em condições avaliadas nessa etapa, produzindo diferentes versões a partir de uma única fonte.

Definindo macros

#define cria uma macro. Sem um valor, ela é apenas uma sinalização que você pode testar posteriormente.

Macros semelhantes a objetos substituem um nome por um texto; sinalizações simplesmente indicam que algo está definido.

#define MAX_USERS 100   /* value macro */
#define DEBUG          /* flag macro */

ifdef e ifndef

#ifdef NAME mantém o bloco somente se NAME estiver definido. #ifndef o mantém somente se NAME não estiver definido.

Aqui, a impressão de depuração existe apenas em compilações de depuração. Sem DEBUG definido, o compilador nem chega a ver essa linha.

#include <stdio.h>
#define DEBUG

int main(void) {
#ifdef DEBUG
    printf("debug: starting\n");
#endif
    printf("running\n");
    return 0;
}

if, elif, else

#if avalia uma expressão inteira constante. Combine-o com #elif e #else para uma seleção entre vários caminhos.

Isso escolhe o código com base em uma macro que representa um número de versão.

#include <stdio.h>
#define VERSION 2

int main(void) {
#if VERSION >= 2
    printf("new feature on\n");
#else
    printf("legacy mode\n");
#endif
    return 0;
}

O operador defined

Dentro de #if, você pode testar se algo está definido com defined(NAME) e combinar testes com && e ||.

Isso é mais flexível que #ifdef, que pode testar apenas um nome.

#if defined(LINUX) && !defined(EMBEDDED)
    /* desktop Linux code */
#endif

Definindo em tempo de compilação

Você não precisa definir macros diretamente no código. A opção -D as define na linha de comando.

É assim que os sistemas de compilação alternam recursos sem editar o código-fonte. -DDEBUG equivale a #define DEBUG no início de cada arquivo.

gcc -DDEBUG -DVERSION=3 -o app app.c

Detecção da plataforma

Os compiladores predefinem macros que descrevem o destino. Você as usa para escrever código portável.

  • _WIN32 — Windows (32 ou 64 bits)
  • __linux__ — Linux
  • __APPLE__ — macOS / iOS

Use condicionais com essas macros para chamar a API correta da plataforma.

#ifdef _WIN32
    #include <windows.h>
#else
    #include <unistd.h>
#endif

Guardas de inclusão de cabeçalho

Um uso clássico das condicionais é a guarda de inclusão, que impede que um cabeçalho seja processado duas vezes.

A primeira inclusão define a macro de guarda; as inclusões seguintes ignoram o corpo porque a macro já está definida.

#ifndef UTILS_H
#define UTILS_H

int add(int a, int b);

#endif /* UTILS_H */

Desativando código com comentários

#if 0 ... #endif desativa um bloco de forma confiável, mesmo que ele já contenha comentários.

Ao contrário de /* */, ele permite aninhamento com segurança, por isso é a forma padrão de excluir temporariamente código durante a depuração.

#if 0
    legacy_function();   /* disabled for now */
    /* with internal comments too */
#endif

Inspecionando a saída do pré-processador

Para ver exatamente o que o compilador compilará, execute apenas o pré-processador com -E.

Isso expande todas as inclusões, macros e condicionais, sendo extremamente útil quando uma macro se comporta de maneira inesperada.

gcc -E app.c | less

Alternância de recursos na prática

Um padrão comum é ter um único cabeçalho de configuração que ativa ou desativa recursos para todo o projeto.

Alterne um único #define e todos os blocos protegidos em todos os arquivos responderão. Isso mantém os recursos opcionais bem separados do código principal.

#include <stdio.h>
#define FEATURE_LOGGING 1

int main(void) {
#if FEATURE_LOGGING
    printf("logging enabled\n");
#endif
    printf("app ready\n");
    return 0;
}

Verificação rápida

Preveja o comportamento de uma definição na linha de comando.

Recapitulação

Agora você controla a compilação condicional:

  • #ifdef/#ifndef testam se uma macro está definida
  • #if/#elif/#else avaliam expressões constantes, com defined()
  • -DNAME define macros na linha de comando para alternar recursos
  • Macros predefinidas da plataforma permitem código portável; guardas de inclusão impedem inclusões duplicadas

Próximo: organizar o código em vários arquivos.

Perguntas Frequentes

A aula “Compilação condicional” é grátis?

Sim — o texto completo de “Compilação condicional” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C Academy, atualize para CoddyKit PRO. O curso de C Academy inclui 4 aulas no total.

O que vou aprender em “Compilação condicional”?

ifdef e macros. Você pratica C Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C Academy?

Nenhuma experiência prévia é necessária. C Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Compilação condicional”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C Academy?

Sim. Cada aula de C Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Compilação condicional
  2. Projetos com vários arquivos
  3. Makefiles
  4. Bibliotecas estáticas e compartilhadas
← Voltar para C Academy