Utilisation de parenthèses dans la définition d’instructions de préprocesseur

Alors je me demandais quand utiliser

#define xxx (yyy) 

contre

  #define xxx yyy 

Mon projet inclut un fichier qui a ses propres définitions, par exemple AD0_ADMD_CT, si je souhaite les redéfinir, devrais-je utiliser (AD0_ADMD_CT) ou simplement AD0_ADMD_CT pour définir ou non?

AD0_ADMD_CT est défini comme

  #define AD1_ADMD_CT (IO_AD1.ADMD.bit.CT) 

Donc ce serait soit

 #define AD0_COMPARETIME (AD0_ADMD_CT) 

ou

 #define AD0_COMPARETIME AD0_ADMD_CT 

Il n’y a pas de différence dans les deux. Dans le premier cas, XXX est remplacé par yyy et par (yyy) est le deuxième cas. La convention d’utiliser des crochets est d’éviter les erreurs logiques pouvant survenir Par exemple, vous définissez la fonction d’addition comme suit:

 #define f(N) N+N int a = f(5)*f(5) 

La valeur attendue est 10 * 10 = 100, mais la sortie est 35 car au moment de la compilation, devient

int a = 5+5*5+5, utilisant donc la règle de préférence de l’opérateur, les modifications en sortie.

Donc, les parenthèses évitent ce type d’erreurs.

En ajoutant des parenthèses, vous forcez l’argument de l’argument situé entre les parenthèses à être évalué avant le rest du corps de la macro. Par conséquent, si vous aviez

 #define MULT(x, y) (x) * (y) // now MULT(3 + 2, 4 + 2) will expand to (3 + 2) * (4 + 2) 

Il ne semble pas que cela affecte votre cas actuel, à moins que vos macros ne vous en demandent plus.

C’est très important si vous avez des opérateurs dans votre macro. Par exemple:

 #define ADD(x,y) x + y ADD(1,2) * 3 /* Should be 9, is 7 */ 

Devrait être:

 #define ADD(x,y) (x + y) ADD(1,2) * 3 /* 7 */ 

Ces problèmes de priorité s’appliquent également aux arguments, comme le dit @ Gi Joe, et doivent être enveloppés dans des parenthèses pour la priorité.

Cependant, pour une macro comme:

 #define MAGICNUM 3 

Ça n’a pas d’importance.

Une chose importante à retenir est que le préprocesseur développe simplement les macros. Par exemple, si vous aviez les lignes suivantes:

 #define AD0_COMPARETIME_1 (AD0_ADMD_CT) #define AD0_COMPARETIME_2 AD0_ADMD_CT num_1 = AD0_COMPARETIME_1; num_2 = AD0_COMPARETIME_2; 

Après la première extension, vous auriez ceci:

 num_1 = (AD0_ADMD_CT); num_2 = AD0_ADMD_CT; 

Et après la deuxième extension, vous auriez ceci:

 num_1 = ((IO_AD1.ADMD.bit.CT)); num_2 = (IO_AD1.ADMD.bit.CT); 

Comme indiqué dans d’autres réponses, un problème peut survenir lorsqu’une expression est développée.