C : plusieurs noms pour une même variable
Pour des raisons de portabilité j'aimerais créer, en langage C, une variable équivalente à une autre mais avec un nom différent. (si possible sans passer par un pointeur)
Pour être plus concret, je programme un microcontrôleur PIC en C et une librairie me donne directement accès à des variable correspondant à des ports du PIC (RC2 par exemple). Pour pouvoir plus rapidement porter le code sur un autre type de microcontrôleur et avoir un code plus lisible j'aimerais par exemple avoir une variable s'appelant "Buzzer" que je puisse utiliser à la place de RC2.
Avez vous la solution?
Merci d'avance pour votre aide.
Benoit
Configuration: Windows XP Internet Explorer 6.0
7 réponses
Pour faciliter le portage sur PIC en C, l'utilisateur cherche à créer une variable équivalente à RC2 sous le nom « Buzzer » sans recours à un pointeur. Plusieurs solutions sont évoquées, notamment l'utilisation de #define pour créer un alias, solution courante en embarqué malgré l'absence de vérification de type et les risques d'erreurs d'évaluation. D'autres suggèrent les fonctions inline comme alternative plus sûre que les macros, mais notent que pour des registres matériels, les macros restent largement employées afin de conserver la portabilité et les performances. En pratique, des conseils d'usage soulignent aussi d'éviter les noms de macros ambigus et d'utiliser des conventions (par exemple identifiants en majuscules avec underscores) pour limiter les collisions et faciliter la maintenance.
-
faut utiliser typedef
typedef type nouveau_type;
-
ModérateurSalut,
Avec des define? -
En fait je pense avoir trouvé tout seul :
#define Buzzer RC2
Ca compile en tout cas..-
Salut
ton #define buzzer RC2 va remplacer tout tes buzzer par RC2 à la compilation donc ce sera seulement peut etre plus compréhensible mais je dirais pas que c'est portable
tu peux très bien faire comme l'exemple qu'on t as donnée en C++ seulement en C la reference n'existe pas et il me semble que ca en est, par contre tu peux utiliser les pointeur seulement pour initialiser au début :
int buzzer;
&buzzer = &RC2;
si c'est une compilation croisée et que ton RC2 est déclaré dans un autre fichier C
tu as juste a ajouter
extern int RC2; -
Contributeur@Pierre Richard&buzzer = &RC2;
ça ne devrais pas compiler, tu ne peux pas modifier l'adresse d'une telle variable normalement.
Sinon, tu peux utiliser une fonction pour la lecture : int buzzer(){return RC2;}
en C++, tu pourrai faire en lecture écriture avec int& buzzer(){return RC2;}
Je ne comprends pas pourquoi il n'y a pas ce passage par référence en C alors que c'est le cas dans les autre langages (C++, pascal, Fortran), bien qu'il est clair que c'est plus rigoureux en C (en effet, sinon comment savoir si f(x) modifie ou non x ?). -
@Char SnipeurDsl Char Sniper a raison, tu peux pas faire, il y a en effet une erreur a la compilation
&buzzer = &RC2;
il faut déclarer buzzer en pointeur par ex :
int RC2;
int * buzzer = &RC2;
mais apres il faut ecrire *buzzer a chaque fois que tu veux utiliser/modifier la valeur et non le pointeur
*buzzer = 10;
printf("buzzer = %d", *buzzer);
Ben en C il y a les pointeur est c tout f(x) ne modifie pas la variable x a moins que ce soit un pointeur et qu'il modifie x dans f bien sur. car on peut passer des pointeurs pour gagner de la place sans pr autant modifier x. Apres on peux expliciter qu'on ne modifie pas la variable avec const ...
-
-
ContributeurEn C++, c'est sur ça fonctionne, il faut déclarer ainsi (à toi de tester)
double &buzzer=RC2; -
Contributeurba non justement, tu gère buzzer ! C'est un vrai alias.
j'ai mis un & et pas un * !-
-
Contributeur@kilianCe que je disais, c'est que j'avais des doutes sur la compatibilité C de cette déclaration, mais si tu dit que c'est réservé au C++, alors il ne faut pas l'utiliser.
C'est la seule procédure que je vois pour contrôler l'adresse d'une variable non alloué avec new. Le #define est une solution, mais pas très propre, les macros entraînes des erreurs à la con, et il vaut mieux les éviter au maximum ! -
Modérateur@Char SnipeurEn fait oui le define est la seule solution à son problème. Les références n'existent pas en C.
Donc rien à faire sinon du crade. -
@Char SnipeurMerci pour votre aide sur le sujet.
Pour info je reste avec mon #define qui marche niquel. Je n'avais jamais entendu que ce n'était pas propre et au contraire. Dans l'embarqué c'est très utilisé et ça permet de gagner énormément de temps quand un paramètre change. Et puis ça ne m'a jamais posé de problème de compilation avec mplab ou codewarrior par exemple.
Et la dans mon cas précis ça facilitera belle et bien la portabilité puisqu'il suffira de remplacer RC2 par le nouveau port si je change de plateforme.
Et dernier point ça améliore grandement la lisibilité.
A+ -
Contributeur@benoitgNon t'inquiète ce n'est pas une solution crade. C'est une solution tout court.
Une solution crade c'est quand il y a de la bidouille. Là, c'est fait pour. Après effectivement, il peut y avoir des erreurs bêtes, mais ça c'est parce que l'utilisateur s'en est mal servi (je pense notamment à l'utilisation du point virgule dans le define ^^).
Sinon par contre en C, au lieu d'utiliser les macros, c'est mieux d'utiliser les fonctions inline.
Cdlt
-
-
Ben en terme de maintenance je dirais que c'est pas top mais bon c'est en effet une solution. Après c'est comme le débat sur les goto et les macro / fct inline
C'est pas "mieux" d'utiliser les macros c'est juste que la fonction inline fait comme une macro et que c'est plus agréable à lire
a+-
-
ContributeurEn terme de maintenance ?
Faut savoir faire la part des choses. Tout coder en macro, effectivement c'est illisible. Par contre utiliser des define pour définir une constante (#define MAX 50), ça c'est tip top (surtout en C, norme 89) Après, il y a d'autres cas où c'est bien pratique (comme le guard, etc).
C'est pas "mieux" d'utiliser les macros c'est juste que la fonction inline fait comme une macro et que c'est plus agréable à lire
Les fonctions inline sont mieux que les macros dans le sens que le compilateur les gère mieux. Dans une macro, le contrôle des types n'existe pas par exemple. Donc, ce n'est pas juste une question de lisibilité. -
Contributeurpour la maintenance, c'est une plaie les macro, en effet. Pour llustrer, ce qui m'est arriver : windows.h contient "#define IN" et le source que j'essayais de compiler "int IN" et forcément, ça génère une erreur, qui n'est pas du tout évidente à trouver !!!
Pour utiliser les nom de macro, je te conseil de les nommé en majuscule et avec un "_" devant, soit "_BUZZER_" pour ton cas.
Le goto, je li partout que c'est vraiment à éviter.
La fonction inline est vraiment mieux, la macro peut entrainer des erreurs vraiment chiante. Par exemple prenons la macro fonction :
#define SQR(x) x*x
Si dans le code source tu fais :
SQR(1+2) le résultat sera 5 (et non 9), car le préprocesseur écrira : 1+2*1+2
C'est pour ces raisons que j'évite au maximum de mélanger ce qui est dans les macros avec ce qui est dans le source, surtout que bien souvent il est possible de faire autrement. -
Contributeur@kilianEt, je ne peux même pas dire copieur car t'as posté avant moi :s
-
Contributeur@Char SnipeurEh oui, les macro, c'est pas terrible pour ça lol. Vive l'inline :d
Les goto, c'est à éviter d'une manière générale car algorithmiquement moche, et illisible.
Mais il y a des cas, ou c'est bien plus joli. Notamment pour la gestion d'erreurs. Faut juste éviter le code spaghetti ^^.
-
-
J'utilise les macro pour verifier les pointeurs ou libéré un pointeur s'il est différent de null et c'est très bien. Utiliser une fonction inline dans ce cas je n'en vois pas l'intéret de plus pr la compilation rien de plus simple.
Je pense que c'est comme le goto a eviter dans la majorité des cas seulement des fois c'est bien utile