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 */
#endifDefinindo 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.cDetecçã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>
#endifGuardas 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 */
#endifInspecionando 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 | lessAlternâ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/#ifndeftestam se uma macro está definida#if/#elif/#elseavaliam expressões constantes, comdefined()-DNAMEdefine 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
- Compilação condicional
- Projetos com vários arquivos
- Makefiles
- Bibliotecas estáticas e compartilhadas