Menu

Comentários em C: // e /* */ explicados

C tem dois estilos de comentário - de uma linha com // e de várias linhas com /* */ - com histórias diferentes e uma armadilha de aninhamento. Veja como usar os dois, além do que vale a pena comentar e do que não vale.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Um comentário é um texto que o compilador joga fora. Ele existe só para as pessoas que vão ler o código depois, e uma delas normalmente é você. C oferece duas formas, e entender quando cada uma é a ferramenta certa leva uns dois minutos.

As duas formas

Execute: a saída é uma linha só. Os dois comentários foram apagados antes de o compilador sequer analisar o programa - eles não custam nada em tempo de execução e não acrescentam nada ao executável.

// vai até o fim da linha física. Nada pode vir depois dele naquela linha, então isto não funciona do jeito que parece:

int x = 5;  // define x como cinco  int y = 6;   /* y nunca é declarado */

/* ... */ termina no primeiro */, onde quer que ele esteja. Pode começar e terminar no meio de uma linha, o que é útil de vez em quando:

int total = preco /* antes do imposto */ + frete;

Por que existem dois estilos

/* */ é o C original, de 1972. // veio do C++ e só foi oficialmente adicionado ao C no C99. Essa história explica algo que você vai notar ao ler código mais antigo: bibliotecas escritas para serem portáveis para C89 usam /* */ até para comentários de uma linha, porque // não compilaria nas ferramentas antigas que elas ainda suportavam.

Hoje todo compilador que você provavelmente vai usar aceita os dois. Use // para observações comuns e /* */ quando um comentário realmente ocupar várias linhas. Se você estiver mirando um compilador embarcado muito antigo, confira antes de depender de //.

Comentários não podem ser aninhados

Esta é a única armadilha de verdade:

/* Desativar esta seção por enquanto
   int a = compute();
   /* o auxiliar clássico - fique de olho nele */
   int b = a * 2;
*/

O comentário de bloco termina no primeiro */, que é o da linha 3. As linhas 4 e 5 voltam a ser código ativo, e o */ final da linha 6 é um erro de sintaxe. A mensagem do compilador aponta para a última linha e é completamente inútil quanto à causa.

A solução é usar o pré-processador, que lida com aninhamento:

#if 0
    int a = compute();
    /* o auxiliar clássico - fique de olho nele */
    int b = a * 2;
#endif

#if 0 nunca é verdadeiro, então o pré-processador apaga tudo até o #endif antes de o compilador ver. Isso sobrevive a comentários, aspas e outros blocos #if lá dentro, e é fácil de procurar quando você for fazer a limpeza.

Comentar código durante a depuração

Remover uma linha temporariamente é o uso mais comum de comentários no dia a dia. Quando um programa se comporta mal, desativar uma instrução por vez te diz qual delas importa.

Descomente o printf e execute de novo para ver o laço montando a resposta. Rastrear com prints não é elegante, mas em C é rápido e sempre funciona - um depurador te diz mais, e um printf te diz algo imediatamente.

Dois hábitos evitam que isso vire bagunça. Apague o código comentado antes de fazer o commit; o controle de versão lembra da versão antiga para você. E quando você deixar uma linha desativada de propósito, diga por quê em uma nota ao lado.

Comentários de documentação

Um comentário de bloco acima de uma função é onde você explica o que ela faz, o que seus parâmetros significam e o que há de surpreendente nela.

Ferramentas como o Doxygen leem comentários estruturados assim e geram documentação de referência. O estilo do próprio Doxygen usa /** ... */ com as marcações @param e @return:

/**
 * Converte Celsius para Fahrenheit.
 * @param c temperatura em Celsius
 * @return a mesma temperatura em Fahrenheit
 */
double celsius_to_fahrenheit(double c);

Qualquer um dos dois serve para o seu próprio código. O que importa é que o comentário fique ao lado da declaração que as pessoas leem - no arquivo de cabeçalho, tipicamente - em vez de enterrado na implementação.

O que vale a pena comentar

A regra que sobrevive ao contato com bases de código reais: comente o porquê, não o quê.

i++;  // incrementa i          <- não diz nada que o código já não dissesse
/* Pula o BOM: arquivos exportados pelo sistema antigo começam com
   três bytes que não fazem parte dos dados. */
offset += 3;

O segundo comentário contém informação que não está em lugar nenhum do código. O primeiro é ruído que uma hora vai contradizer a linha que descreve, porque comentários não são atualizados quando o código muda.

Coisas que realmente merecem um comentário especificamente em C:

  • De quem é esta memória. Se uma função retorna um ponteiro que quem chamou precisa liberar com free, diga isso. C não tem como expressar isso no tipo.
  • Unidades e faixas. int timeout; é ambíguo - segundos ou milissegundos?
  • Correção não óbvia. Por que o laço para em n - 1, por que este cast é seguro, por que o buffer tem 256 bytes.
  • Estranheza deliberada. Código que parece um bug mas não é atrai "correções" de futuros leitores, a menos que esteja sinalizado.

Esse comentário merece o lugar dele: a linha abaixo parece redundante e não é.

Comentários dentro de strings não são comentários

Um último detalhe. Marcadores de comentário não têm significado especial dentro de um literal de string ou de uma constante de caractere:

As duas linhas são impressas por inteiro. O compilador tokeniza as strings antes de procurar comentários, então // dentro de aspas é simplesmente dois caracteres. (O %% da primeira linha é como se imprime um sinal de porcentagem literal com printf - % sozinho inicia um especificador de formato.)

Perguntas frequentes

Como se escreve um comentário em C?

De duas formas. // isto é um comentário vai até o fim da linha. /* isto é um comentário */ pode ocupar quantas linhas você quiser e termina no */ de fechamento. Os dois são removidos antes da compilação, então nunca afetam o programa.

C aceita comentários com //?

Sim, desde o C99. Eles foram emprestados do C++ e hoje são aceitos em todo lugar. Só compiladores C89 realmente antigos os rejeitam, e é por isso que código muito velho usa /* */ para tudo, até para uma linha só.

Dá para aninhar comentários em C?

Não. /* externo /* interno */ ainda externo */ termina no primeiro */, deixando ainda externo */ como código quebrado. Para desativar um bloco que já contém comentários /* */, use #if 0 ... #endif, que aninha corretamente.

Como comentar um bloco de código em C?

Envolva-o em /* */ se ele não tiver comentários de bloco dentro, ou coloque // no começo de cada linha. A opção robusta para regiões grandes é #if 0 antes e #endif depois - o pré-processador remove tudo que está no meio, e isso sobrevive a comentários e aspas lá dentro.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR