Pergunta

É "seguro" para dar macros nomes como argumentos para outras macros para simular funções de ordem superior?

i. onde eu deveria olhar para não atirar no próprio pé?

Aqui estão alguns trechos:

#define foreach_even(ii, instr) for(int ii = 0; ii < 100; ii += 2) { instr; }
#define foreach_odd(ii, instr)  for(int ii = 1; ii < 100; ii += 2) { instr; }

#define sum(foreach_loop, accu) \
  foreach_loop(ii, {accu += ii});

int acc = 0;
sum(foreach_even, acc);
sum(foreach_odd, acc);

E sobre a aplicação parcial, posso fazer isso? :

#define foreach(ii, start, end, step, instr) \
  for(int ii = start; ii < end; ii += step) { instr; }

#define foreach_even(ii, instr) foreach(ii, 0, 100, instr)
#define foreach_odd(ii, instr)  foreach(ii, 1, 100, instr)

#define sum(foreach_loop, accu) \
  foreach_loop(ii, {accu += ii});

int acc = 0;
sum(foreach_even, acc);
sum(foreach_odd, acc);

E posso definir uma macro dentro de uma macro?

#define apply_first(new_macro, macro, arg) #define new_macro(x) macro(arg,x)
Foi útil?

Solução

Se você estiver em uso de pré-processamento, tanto quanto possível, você pode querer tentar boost.preprocessor .

Mas esteja ciente de que é não segura para fazer isso. Vírgulas, por exemplo, fazer com que um grande número de problemas ao usar preprocessors. Não se esqueça que preprocessors não entendem (ou mesmo tentar compreender) qualquer código que estão gerando.

Meu conselho básico é "não faça isso", ou "fazê-lo tão cautelosamente quanto possível".

Outras dicas

Eu tenho implementado um framework de testes pouco unidade podre inteiramente em c-pré-processador. Várias dezenas macro, lotes de macro é um argumento para outro tipo de coisas macro.

Este tipo de coisa é não "seguro" em um melhores práticas sentido da palavra. Há formas sutis e muito poderosas para atirar no próprio pé. O projeto de teste de unidade é um brinquedo que ficou fora de controle.

Não sei se você pode aninhar definições de macro. Eu duvido, mas eu vou tentar ... gcc não gosta, e responde com

nested_macro.cc:8: erro: perdido '#' no programa
nested_macro.cc:3: erro: esperado construtor, destruidor ou conversão de tipo antes de '(' token de
nested_macro.cc:3: erro: declaração esperado antes '}' símbolo

ficha de auto : Se você estiver interessado a unidade de estrutura de teste pode ser encontrada em https://sourceforge.net/projects/dut/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top