ti-enxame.com

Por que usar #if para bloco comentando?

Código de engenharia reversa e estou meio chocado com o estilo, mas queria ter certeza de que não há uma boa razão para fazer essas coisas ...

É só eu ou isso é um estilo de codificação horrível

if ( pwbuf ) sprintf(username,"%s",pwbuf->pw_name);
else sprintf(username,"%d",user_id);

E por que envolver o código não destinado à compilação em um

#if 0
....
#endif

Em vez de comentários?


EDIT: Então, como alguns explicados abaixo, isso é devido à possibilidade de flummox/* */que eu não percebi.

Mas eu ainda não entendo, porque não basta usar as ferramentas do ambiente de programação ou as macros do editor de texto favorito para bloquear o comentário usando "//"

isso não seria MUITO mais simples e fácil de saber para pular visualmente?


Eu sou apenas inexperiente em C e sinto falta de por que essas coisas podem ser uma boa idéia - ou não há desculpa, e estou justificado em me sentir irritado com o quão feio esse código é?

28
Jason R. Mick

#if 0 é usado com bastante frequência quando o bloco removido contém comentários de bloco

Não vou dizer que é uma boa prática, mas vejo isso com muita frequência.

A instrução + controle de fluxo de linha única é fácil o suficiente para entender, embora eu pessoalmente a evite (e a maioria das diretrizes de codificação nas quais trabalhei proíbem)

BTW, eu provavelmente iria editar o título para ser um pouco útil "Por que usar # if 0 em vez de bloquear comentários"

Se você tem o seguinte

#if 0
        silly();
        if(foo)
           bar();
        /* baz is a flumuxiation */
        baz = fib+3;
#endif

Se você ingenuamente substituir o #if 0/#endif por /* */, isso fará com que o comentário termine logo após a flumuxiation, causando um erro de sintaxe quando você pressionar o */ no lugar do #endif acima.

EDIT: Uma nota final, muitas vezes a sintaxe #if 0 é apenas usada durante o desenvolvimento, especialmente se você tiver que suportar várias versões ou dependências ou plataformas de hardware. Não é incomum que o código seja modificado para 

#ifdef _COMPILED_WITHOUT_FEATURE_BAZ_
    much_code();
#endif

Com um cabeçalho centralizado definindo (ou não) centenas dessas constantes #define. Não é a coisa mais bonita do mundo, mas toda vez que trabalhei em um projeto de tamanho decente, usamos uma combinação de opções de tempo de execução, constantes de tempo de compilação (isso), decisões de compilação em tempo de compilação (basta usar diferentes. cpp dependendo da versão) e a solução de modelo ocasional. Tudo depende dos detalhes.

Enquanto você é o desenvolvedor apenas começando a coisa trabalhando em primeiro lugar, embora ... #if 0 é bastante comum se você não tiver certeza se o código antigo ainda tem valor.

36
jkerian

Comentários são comentários. Eles descrevem o código.

O código que está sendo excluído da compilação é código, não comentários. Frequentemente incluirá comentários, que descrevem o código que não está sendo compilado, no momento /

São dois conceitos distintos e forçar a mesma sintaxe me parece um erro.

19
Jeff Dege

Além do problema com os comentários no estilo C sem aninhamento, a desativação de blocos de código com #if 0 tem a vantagem de poder ser recolhida se você estiver usando um editor que suporte a dobra de código. Também é muito fácil de fazer em qualquer editor, enquanto desativar grandes blocos de código com comentários no estilo C++ pode ser difícil sem suporte/macros do editor.

Além disso, muitos blocos #if 0 também possuem um bloco else. Isto dá uma maneira fácil de trocar entre duas implementações/algoritmos, e é sem dúvida menos propenso a erros do que comentar em massa uma seção e descomentar em massa outra. No entanto, seria melhor usar algo mais legível como #if DEBUG nesse evento.

5
bta

Isso é bem idiomático C ali. Eu não vejo o que há de errado com isso. Não é um belo pedaço de código, mas é fácil de ler e está claro o que está acontecendo e por quê, mesmo sem contexto.

Os nomes das variáveis ​​poderiam ser melhores e provavelmente seria mais seguro usar snprintf ou talvez strncpy.

Se você acha que poderia ser melhor, como você preferiria?

Eu poderia fazer uma pequena mudança:

char username[32];
strncpy(username, 30, (pwbuf ? pwbuf->pw_name : user_id));
username[31] = '\0';
3
Steven Schlansker

No que diz respeito ao comentário em bloco usando //, uma razão que eu posso pensar é que, se você verificar esse código em seu sistema de controle de origem, o log de culpa mostrará você como o último editor para essas linhas de código. Embora você provavelmente queira que o comentário seja atribuído a você, ao mesmo tempo, o próprio código também está sendo atribuído a você. Claro, você pode voltar e olhar para as revisões anteriores, se você precisar verificar o log de culpas para o autor "real" do código, mas economizará tempo se você preservou essa informação na revisão atual.

3
Aaron Klotz

Obviamente, todo mundo tem suas próprias opiniões sobre esse tipo de coisa. Então aqui está o meu:

Eu escreveria nunca escrever código como o acima, e pensaria menos de qualquer um que fizesse. Eu não posso contar o número de vezes que as pessoas acham que está tudo bem sair sem chaves de escopo, e então foram mordidas por ele.

Colocar a instrução de controle na mesma linha que o bloco de código é ainda pior; a falta de recuo dificulta a visualização do controle de fluxo durante a leitura. Depois de codificar por alguns anos, você se acostuma a ler e interpretar códigos com rapidez e precisão, contanto que você possa confiar em certas dicas visuais. Contornar esses sinais para "casos especiais" significa que o leitor precisa parar e dar uma olhada, sem uma boa razão.

#if (0), por outro lado, está ok durante o desenvolvimento, mas deve ser removido quando o código estiver "estável" (ou pelo menos substituir 0 por algum nome significativo de símbolo do pré-processador).

1
Oliver Charlesworth

Woah lá! Não exagere ...

Eu chamaria de desleixado por mais o espaçamento inconsistente do que qualquer outra coisa. Eu tive tempo em que achei melhor colocar declarações curtas na mesma linha de seu FI, embora essas instruções estejam esticando-as.

O estilo inline é melhor para a brevidade vertical ... pode ser facilmente dividido em 4, mais linhas

if (pwbuf) 
  sprintf(username,"%s",pwbuf->pw_name); 
else 
  sprintf(username,"%d",user_id); 

Pessoalmente, eu odeio o próximo estilo, já que ele é tão longo, dificultando a leitura de um arquivo.

if (pwbuf) 
{
  sprintf(username,"%s",pwbuf->pw_name); 
}
else
{ 
  sprintf(username,"%d",user_id); 
}
0
smdrager

i punti sopra indicati. Você pode monitorar sono widescreen e tutti, al giorno d'oggi, non mi dispiace

if (pwbuf) sprintf(username,"%s",pwbuf->pw_name);
else       sprintf(username,"%d",user_id);

Sembra sempre averte troppo spazio orizzontale e não abbastanza spazio verticale sul mio schermo!

Em vez disso, deve-se usar o código de código para instruções pré-processadas, não utilizar #if 0; se o codice ha già comenta di blocco, não utilizare /* */. Se ha già entrambi, o ricorrere a un editore che ha unctrl+/, por comentarare molte righe. No caso contrário, sei pieno, elimina o codice um titolo definitivo!

0
Sanjay Manohar
if ( pwbuf ) sprintf(username,"%s",pwbuf->pw_name);
else sprintf(username,"%d",user_id);

Idiomático e conciso. Se ele tocou mais de 2 ou 3 vezes, eu colocaria bracket e next-line. Não é muito sustentável se você adicionar informações de registro ou outras condições.

#if 0
....
#endif

É bom ativar blocos de código de depuração ou não. Além disso, evitaria erros de compilação relacionados à tentativa de bloquear comentários desse tipo de coisa:

/* line comment */
...
/* line comment again */

Como os comentários do bloco C não se aninham.

0
Paul Nathan

Muito ocasionalmente eu uso o estilo mais conciso quando ele suporta a simetria de código e as linhas não ficam muito longas. Tome o seguinte exemplo artificial:

if (strcmp(s, "foo") == 0)
{
    bitmap = 0x00000001UL;
    bit = 0;
}
else if (strcmp(s, "bar") == 0)
{
    bitmap = 0x00000002UL;
    bit = 1;
}
else if (strcmp(s, "baz") == 0)
{
    bitmap = 0x00000003UL;
    bit = 2;
}
else if (strcmp(s, "qux") == 0)
{
    bitmap = 0x00000008UL;
    bit = 3;
}
else
{
    bitmap = 0;
    bit = -1;
}

e a versão concisa:

if      (strcmp(s, "foo") == 0) { bitmap = 0x00000001UL; bit = 0;  }
else if (strcmp(s, "bar") == 0) { bitmap = 0x00000002UL; bit = 1;  }
else if (strcmp(s, "baz") == 0) { bitmap = 0x00000003UL; bit = 2;  }
else if (strcmp(s, "qux") == 0) { bitmap = 0x00000008UL; bit = 3;  }
else                            { bitmap = 0;            bit = -1; }

Bugs são muito mais propensos a pular direto para o seu rosto.

Disclaimer: Este exemplo é inventado, como eu disse. Sinta-se à vontade para discutir o uso de strcmp, números mágicos e se uma abordagem baseada em tabelas seria melhor. ;)

0
Secure