Jump to content

MACRO - passagem parâmetros por referencia


Guest yyajsayy
 Share

Recommended Posts

Guest user14912

Boas, queria saber se é possível fazer a passagem de parâmetros por referência em macros, como trocar o valor entre duas variáveis.

Algo do género:


#define troca(*a,*b)\
{ int x=*a;                \
  *a=*b;                   \
  *b=x;                     \
}

Ou não são permitidos '*' nas macros? Cheira-me a isso 🙂

Thanks 😉

Link to comment
Share on other sites

Guest user14912

Sim, essa eu conheco, mas queria mesmo resolver isto daquela forma.

não tenho a certeza do que pretendes, visto que também não tenho a certeza do que é uma Macro em C.

Podes sempre fazer isso com uma função.

@lordfokas imagina que no meu programa principal tenho duas variáveis com 2 valores distintos.


int a=2;
int b=3;

Agora o que eu queria era trocar o seu valor, mas sem ser com função, isso numa função não teria qualquer dificuldade, passaria-lhe a e b por referência e alterava o seu valor ou o endereço de cada uma delas.

Exemplo:


int troca(int *a,int *b) {

int x=*a;
*a=*b;
*b=x;

return(1);
}

Pronto, a ideia e essa @lordfokas, mas agora fazê-lo numa macro da mesma forma.

Porquê macro?

A maior vantagem para o uso de macros é o desempenho, em comparação com a utilização de funções. Não são gastos recursos a passar o controlo de execução para a nova função.

Sê alguém tiver conhecimento sobre esse tema, que parti-lhe sff, não é importante mas é sempre bom saber estes pequenos pormenores do C 🙂

thanks 😉

Link to comment
Share on other sites

Se queres utilizar uma macro por causa do desempenho, a sugestão do Localhost é a mais indicada: 3 XORs são mais rápidos do que instanciação e afectações.

Doutra maneira, podes utilizar uma função inline, em que não existe transferência de controlo, uma vez que o código é inserido no sitio onde é chamada a função, e assim já podes utilizar a passagem de apontadores para o efeito que queres.

Pessoalmente, concordo com o Bjarne Stroustrup quando aconselha a reduzir o uso de macros ao mínimo. É muito mais elegante o uso de constantes e funções inline que o uso de macros, e não existem quaisquer vantagens no seu uso.

Desaparecido.

Link to comment
Share on other sites

Se queres utilizar uma macro por causa do desempenho, a sugestão do Localhost é a mais indicada: 3 XORs são mais rápidos do que instanciação e afectações.

Doutra maneira, podes utilizar uma função inline, em que não existe transferência de controlo, uma vez que o código é inserido no sitio onde é chamada a função, e assim já podes utilizar a passagem de apontadores para o efeito que queres.

Pessoalmente, concordo com o Bjarne Stroustrup quando aconselha a reduzir o uso de macros ao mínimo. É muito mais elegante o uso de constantes e funções inline que o uso de macros, e não existem quaisquer vantagens no seu uso.

Ele quando disse isso estava a referir-se ao C++ penso. As Macros em C são essenciais para gerar código automaticamente.

Link to comment
Share on other sites

Guest user14912

Esse seria o mínimo. Nos casos em que seja possível utilizar outras facilidades em vez de macros, essas devem ser utilizadas.

Mas o uso de macros é muito importante em ANSI C, torna o código muito mais optimizado e legível.

E no que toca ao pré-processamento, pelo menos foi o que andei a ler 😛

Bem, mas um MUITO OBRIGADO a todos 😁

Link to comment
Share on other sites

Mais optimizado e legível? O que te leva a dizer isso? Nos casos referidos (funções inline e constantes) a legibilidade é exactamente a mesma. A optimização é discutível; como o compilador substitui as chamadas a funções inline pelo seu código, não há transferência do controlo da execução, e não há perdas de desempenho.

Além disso, tens mais flexibilidade na criação de funções inline que na criação de macros. A declaração de variáveis (como fizeste no teu exemplo no 1º post) é uma delas. Ao fazê-lo numa macro, vais ter problemas se utilizares a macro mais que uma vez na mesma função. E mesmo que só a utilizes uma vez, podes ter declarado na macro um nome já existente no sítio onde a utilizas.

Desaparecido.

Link to comment
Share on other sites

Guest user14912

Daí cumprires certo critérios na criação das macros, elas são do melhor a nível de optimização de código, mas para que não tenhas problemas no seu uso deves seguir os ditos critérios.

Por exemplo na sua declaração e por aí fora, acho que não há necessidade em enumera-los.

São opções de programação, nada mais, mas como o meu assunto não foi em diante encerramos aqui o tópico 😛

Se surgir uma novidade volto a colocar.

thanks for help  😁

Link to comment
Share on other sites

"são do melhor" não explica nada. Tu compreendes o que são macros, e o que são funções inline? São quase o mesmo, sendo que as macros são simples substituições de texto feitas pelo pré-processador, e as funções inline são tratadas pelo próprio compilador, tendo uma relação mais próxima com este e evitando assim muitas das complicações que advêm do uso de macros. Como as que enumerei.

Consegues demonstrar-me em que é que as macros são melhores que as funções inline?

Desaparecido.

Link to comment
Share on other sites

Guest user14912

Claro que sei, eu acho funções inline muito úteis, não disse o contrário, visto que quando o compilador compila o código chama a  função inline para junto da invocação, são óptimas para processamento rápido mas pequeno.

Mas cuidado, funções inline não são ANSI C, são uma extensão do C++ daí continuar a preferir macros em C, apesar de alguns compiladores as aceitarem.

Link to comment
Share on other sites

Claro que sei, eu acho funções inline muito úteis, não disse o contrário, visto que quando o compilador compila o código chama a  função inline para junto da invocação, são óptimas para processamento rápido mas pequeno.

E em que é que as macros lhes são superiores...?

Mas cuidado, funções inline não são ANSI C, são uma extensão do C++ daí continuar a preferir macros em C, apesar de alguns compiladores as aceitarem.

Funções inline estão incluídas no standard C99, não são extensões. São consideradas extensões em implementações anteriores a este standard.

Desaparecido.

Link to comment
Share on other sites

Guest user14912

Acho que já estamos a fugir um pouquinho ao tópico do meu assunto, apesar de tudo a palavra-chave inline deriva do C++, é uma relação existente entre C e C++.

Vantagens?

Poderá ter muitas, visto que até foi desenvolvida posteriormente, mas acho que o seu uso é "quase equivalente" ao das macros.

😛

E continuo com a minha opinião, cada programador tem as suas escolhas e a sua opinião 😁

Espero por mais alguma resposta dos entendidos no assunto acima mencionado [ MACRO - passagem parâmetros por referencia].

Link to comment
Share on other sites

Espero por mais alguma resposta dos entendidos no assunto acima mencionado [ MACRO - passagem parâmetros por referencia].

Se continuas a insistir nisso, acho que ainda não percebeste muito bem como funcionam as macros. Não existe "passagem de parâmetros" porque o que acontece é pura e simplesmente uma substituição de texto. Algo como

#define troca(*a,*b)\
{ int x=*a;                \
  *a=*b;                   \
  *b=x;                     \
}

não faz sentido porque a sintaxe não é válida. No entanto, nem precisas de nada parecido com apontadores, porque o pré-processador vai substituir o código pela definição da macro, e os nomes dos "parâmetros" da macro serão substituídos pelos das variáveis que colocares entre parêntesis. Se utilizares a macro da seguinte forma:

#define troca(a, b) {\
 int temp = a; \
 a = b; \
 b = temp; \
}

//...
   int inteiro1 = 10, inteiro2 = 20;
   troca(inteiro1, inteiro2);
//...

o que o compilador vai ver é

    int inteiro1 = 10, inteiro2 = 20;
   {   int temp = inteiro1;   inteiro1 = inteiro2;   inteiro2 = temp; }

Substituição simples de texto.

EDIT: Dá uma vista de olhos pela enorme discussão que o Localhost colocou aí.

Desaparecido.

Link to comment
Share on other sites

sinceramente acho essa discussão muito estúpida.

Se queres usar macros em vez de funções por causa de meia dúzia de nanossegundos de diferença, vai programar em Assembly...

de referir também que as macros são tidas em conta como uma má prática de programação, visto que têm tendência a gerar resultados inesperados.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.