Ou, para proteger contra problemas de macro aninhados: E isso é o que é compilado: Use para combinar parâmetros de macro em um único token (nome da variável de token, etc) E para seqüenciar um parâmetro de macro (muito útil ao fazer reflexão em CC) Use um Prefixo para suas macros, uma vez que eles estão todos no mesmo namespace e você não quer colisões com nenhum outro código. (Eu escolhi o MLV com base no seu nome de usuário) As macros do wrapper ajudam se você aninhar macros, ou seja, chamar MLVGET de outra macro com outros parâmetros de intercâmbios combinados (conforme o comentário abaixo, obrigado). Respondeu 30 de abril 09 às 12: 02 eu discordo, chrish. Antes de lambda39s, foreach era uma coisa desagradável, porque o código de cada elemento era executado não era local para o ponto de chamada. para cada. (E eu recomendo BOOSTFOREACH em vez de uma solução rolada manualmente) deixe que você mantenha o código próximo ao site da iteração, tornando-o mais legível. Dito isto, uma vez que os lambda39s se desenrolam, foreach pode mais uma vez ser o caminho a seguir. Ndash GManNickG 18 de agosto 09 às 23:50 Os guardas de arquivos de cabeçalho requerem macros. Existem outras áreas que exigem macros. Não há muitos (se houver). Existem outras situações que se beneficiam das macros SIM. Um lugar que uso macros é com código muito repetitivo. Por exemplo, ao encaixar o código C para ser usado com outras interfaces (COM, Python, etc.), preciso capturar diferentes tipos de exceções. É como eu faço isso: tenho que colocar essas capturas em todas as funções do wrapper. Em vez de digitar os blocos de captura completos de cada vez, eu simplesmente digito: isso também facilita a manutenção. Se eu tiver que adicionar um novo tipo de exceção, há apenas um lugar que eu preciso para adicioná-lo. Existem outros exemplos úteis também: muitos dos quais incluem as macros de pré-processador FILE e LINE. De qualquer forma, as macros são muito úteis quando usadas corretamente. As macros não são malignas - o mal uso é o mal. Digamos bem, ignore coisas óbvias como guardas de cabeçalho. Às vezes, você deseja gerar código que precisa ser copipotado pelo précompilador: o que permite codificar isso: e pode gerar mensagens como: Observe que misturar modelos com macros pode levar a resultados ainda melhores (ou seja, gerando automaticamente os valores lado a lado - lado com seus nomes de variáveis) Outras vezes, você precisa do arquivo e ou a Linha de algum código, para gerar informações de depuração, por exemplo. O seguinte é um clássico para o Visual C: como acontece com o seguinte código: gera mensagens como: outras vezes, você precisa gerar código usando os operadores de concatenação e, como gerar getters e setters para uma propriedade (isto é para casos bastante limitados , através). Outras vezes, você irá gerar código do que não compilar se usado através de uma função, como: O que pode ser usado como (ainda, eu só vi esse tipo de código corretamente usado uma vez). Por último, mas não menos importante, o famoso boost :: foreach. (Nota: código copypasted da página inicial do impulso) Qual é (IMHO) caminho melhor do que std :: foreach. Assim, as macros são sempre úteis porque estão fora das regras normais do compilador. Mas eu acho que a maioria do tempo que eu vejo um, eles são efetivamente permanece de código C nunca traduzido em C. correto. Mesmo com C11, muito do que sua macro pode ser deixada para uma função a ser feita: incluir ltsstreamgt incluir ltiostreamgt usando namespace Std void trace (arquivo char const, int line, ostream amp o) struct Oss definem TRACE (ostrorstuff) trace (FILE, LINE, Oss (). Lval () ltltostreamstuff) int main () Dessa forma, a macro é bem mais curta. Ndash Rainer Blome 29 de abril 16 às 13:28 No meu último trabalho, eu estava trabalhando em um scanner de vírus. Para tornar a coisa mais fácil para eu depurar, eu tinha muitos logs presos em todo o lugar, mas em um aplicativo de alta demanda como esse, a despesa de uma chamada de função é muito cara demais. Então, eu vim com esta pequena Macro, que ainda me permitiu habilitar o log de depuração em uma versão de lançamento em um site de clientes, sem o custo de uma chamada de função verificaria o sinalizador de depuração e simplesmente retornaria sem registrar nada ou se ativado , Faria o registro. A macro foi definida da seguinte forma: devido ao VAARGS nas funções de log, este foi um bom caso para uma macro como essa. Antes disso, eu usei uma macro em um aplicativo de alta segurança que precisava dizer ao usuário que eles não tinham o acesso correto, e eles diriam para que bandeira eles precisavam. A (s) Macro (s) definida (s) como: Então, podemos simplesmente polvilhar as verificações em toda a UI, e isso lhe direi quais funções foram permitidas para executar a ação que você tentou fazer, se você ainda não tiver esse papel. A razão de dois deles era retornar um valor em alguns lugares e retornar de uma função vazia em outros. De qualquer forma, foi assim que os usei e não tenho certeza de como isso poderia ter sido ajudado com os modelos. Além disso, eu tento evitá-los, a menos que REALMENTE necessário. Outras macas foreach. T: tipo, c: container, i: iterator Usage (conceito que mostra, não real): melhores implementações disponíveis: Google BOOSTFOREACH Talvez o uso greates de macros esteja em desenvolvimento independente da plataforma. Pense em casos de inconsistência de tipo - com macros, você pode simplesmente usar arquivos de cabeçalho diferentes - como: - WINTYPES. H Muito legível do que implementá-lo de outras maneiras, para minha opinião. Eu uso macros para definir facilmente Exceções: onde DEFEXCEPTION é Parece que VAARGS só foi mencionado indiretamente até agora: Ao escrever o código C03 genérico, e você precisa de um número variável de parâmetros (genéricos), você pode usar uma macro ao invés de um modelo. Nota: Em geral, o nome checkthrow também pode ser incorporado na função hipotética getopfromname. Este é apenas um exemplo. Pode haver outro código genérico em torno da chamada VAARGS. Uma vez que recebemos modelos variadic com C11, podemos resolver isso corretamente com um modelo. Eu acho que esse truque é um uso inteligente do préprocessador que não pode ser emulado com uma função: então você pode usá-lo assim: Você também pode definir uma macro RELEASEONLY. Este truque não funciona de acordo com o padrão. Ele tenta criar um marcador de comentário através do pré-processador, mas os comentários devem ser removidos antes do pré-processador ser executado. Um compilador compatível causará um erro de sintaxe aqui. Ndash David Thornley 23 de outubro 08 às 19:20 Desculpe David, mas o compilador deve conter uma segunda cópia de remoção de comentários. Ndash Joshua 13 de agosto de 09 às 20:16 muito mais fácil é fazer com que o sinalizador de depuração seja um bool const global e usar um código como este: if (debug) cout ltlt quot. Quot - não há necessidade de macros ndash Stefan Monov Jan 17 10 às 16:51
No comments:
Post a Comment