2010-07-02 5 views
3

J'ai un code dans une fonction que je veux séparer dans sa propre fonction. Je veux le faire avec aussi peu de modifications que possible au code original. Ci-dessous, j'ai écrit un exemple noddy où le segment de code est simplement "x + = y". Je veux sortir ce code et le mettre dans sa propre fonction. Avec C je dois le faire en changeant y dans un pointeur et en travaillant avec ça. Mais je me souviens d'avoir lu quelque part (maintenant oublié) qu'il y a un truc en C++ où je peux passer la variable de telle sorte que le code puisse rester "x + = y".Transfert de code à une sous-fonction

FYI: Je veux faire ce processus (et peut-être l'inverser plus tard) comme je fais un profilage de callgraph.

void main() 
{ 
    int x = 2; 
    int y = 5; 

    #if KEEP_IN_BIG_FUNC 

     x += y; 

    #else // put in sub function 

     sub_function(y,&x); 

    #endif 

    printf("x = %d\n",x); // hopefully will print "7" 
} 

void sub_function(int y,int *x) 
{ 
    *x += y; 
} 

Répondre

2

Je crois que ce que vous cherchez est une référence. Dans votre exemple, la fonction sub_function alors ressembler à ceci:

void sub_function(int y, int& x) 
{ 
    x += y; 
} 

et que vous appelleriez cette façon:

sub_function(y, x); 
3

Cette astuce est appelée passage par référence. Le C++ FAQ A une bonne section sur les références ici:

https://isocpp.org/wiki/faq/references

+0

S'il vous plaît, ne postez pas de liens sans même travailler un peu sur la réponse. –

+0

Pourquoi pas? Le lien explique très clairement et complètement comment les références fonctionnent en C++ ... si l'OP le lit, il apprendra ce qu'il a besoin de savoir au moins aussi bien qu'il le ferait si je tapais la réponse ici. –

5

vous passeriez la variable par référence:

void sub_function(int y, int& x) 
{ 
    x+=y 
} 
+0

En fait, à des fins de lisibilité, il serait préférable de retourner le résultat comme une vraie fonction: int fonction_int (int y, int x) { return (x + = y); } – txwikinger

+0

Dans le cas d'un entier, bien sûr. Mais pour un grand type défini par l'utilisateur, l'efficacité du passage par référence l'emporterait sur la lisibilité. – MarkD

2

Il est appelé passage une référence:

void sub_function(int y, int &x) { 
    x += y; 
} 

appelé comme:

sub_function(y,x); 
0

Btw, ayant sub_function inline n'aura aucun impact sur perforamce par rapport à main avec KEEP_IN_BIG_FUNC mis à 1.