Il n'y a aucun moyen portable pour écrire une macro pour renvoyer une valeur à partir d'une déclaration, en particulier une déclaration complexe. Vous voulez utiliser une macro pour implémenter une chose polymorphe ... Vous pouvez utiliser des fonctions surchargées C++ à cette fin.
Pour C, vous pouvez écrire une macro qui met à jour une variable et transmettre cette variable à printf
. Prenez garde que les macros sont des sources notoires de bogues non triviaux.
Vous pouvez également utiliser les fonctions génériques C11, mais le soutien de ceux-ci est souvent manquante.
Voici une tentative:
#include <stdio.h>
#define set_mean(res,x,N) do { res = 0; for (int i_ = 0; i_ < (N); i_++) res += (x)[i_]; res /= (N); } while (0)
int main(void) {
const int N = 100;
int i[N];
double d[N];
double ires, dres;
// here we fill the arrays with data, and then
set_mean(ires, i, N);
set_mean(dres, d, N);
printf("%f %f %f\n", ires, dres);
}
Ne peut pas être fait. pas avec une boucle. – cleblanc
Le problème est qu'il est très très difficile de renvoyer une valeur à partir d'une macro multi-instructions. Vous pouvez le faire si vous pouvez construire la macro multi-instructions comme une simple virgule, mais quand vous le faites de cette façon, vous ne pouvez pas déclarer de variables locales, comme le '_sum' dont vous avez besoin ici. –
Deux possibilités: (1) gcc a une extension où une boucle peut renvoyer une valeur, de sorte que pourrait fonctionner. (2) Utilisez C++ et un modèle. –