Declaration de fonctions statiques, warning multiples - C++ - Programmation
Marsh Posté le 06-01-2009 à 22:02:47
Tu parles du mot-clef "static" ? Car il ne signifie pas la même chose selon qu'il est utilisé pour une variable dans une fonction ou pour une variable globale/pour une fonction.
Dans le premier cas il rend la variable persistante quels que soient le nombre d'appels à la fonction. Dans le second il réduit la portée de la variable/fonction au seul fichier dans lequel elle est définie.
Sans parler des méthodes...
( http://msdn.microsoft.com/en-us/library/s1sb61xd.aspx )
Bref, peux-tu préciser le contexte ?
Quant à ton warning : tout comme JoelF, je ne vois pas ce qui peut causer de telles alertes.
Marsh Posté le 06-01-2009 à 22:03:13
Code :
|
Un fichier qui incluerait static_functions.h (ce fichier, enfin une partie) et qui n'utiliserai qu'une des deux fonction obtiendrai un warning... en tout cas chez moi.
Et j'aimerai que ce warning n'apparaisse pas. Parce que ca rend la compilation illisible face a d'autres warning, ou a la recherche d'erreur quand il y en a.
Est-ce que mon exemple est assez, ou je fais deux vrais mini fichiers ?
Marsh Posté le 06-01-2009 à 22:10:24
Je parie que tes warnings sont de type "cette fonction est définie mais non utilisée".
Est-ce exact ?
Dans ton cas précis, le mot-clef "static" n'a pas le sens que tu crois. Tu peux l'enlever, tes fonctions sont déjà "statiques", au sens où tu l'entends.
Marsh Posté le 06-01-2009 à 22:19:13
Elmoricq a écrit : Je parie que tes warnings sont de type "cette fonction est définie mais non utilisée". |
Oui c'est ce warning.
Or, si j'enleve static, ca ne link plus : pourquoi ? Parce que ces fonctions sont utilisees par plusieurs objets, et il me sort (au link) :
Code :
|
Marsh Posté le 06-01-2009 à 22:29:57
De ce que je comprends, ton problème vient surtout du fait que tu as plusieurs fonctions portant le même nom.
Dans ce contexte, "static" résoud en quelque sorte ton problème parce qu'utilisé comme tu le fais, il réduit la portée de ta fonction au seul fichier utilisant directement ton .h, elle est donc invisible au reste du programme.
Le revers de la médaille étant que le compilateur, du coup, s'étonne d'avoir une fonction définie mais non utilisée.
Voila pour l'explication.
Si c'est normal d'avoir plusieurs définitions de ta fonction, alors la seule solution "viable" que je vois est de désactiver ce warning dans g++.
Je crois, mais c'est à tester, que c'est quelque chose du genre "-Wno-unused-function"
Essaie sur ce lien : http://gcc.gnu.org/onlinedocs/gcc/ [...] ng-Options
(mais il y a peut-être d'autres solutions, comme utiliser celles de la bibliothèque si elles ont le même comportement, ou leur donner un autre nom dans le cas contraire)
Marsh Posté le 06-01-2009 à 22:32:57
ReplyMarsh Posté le 06-01-2009 à 22:45:14
Joel F a écrit : euh pas de fonction dans des .h si elles ne sont pas inline svp :{ |
En meme temps, utiliser un .cpp pour 6 fonctions qui sont toutes uniques.
Par contre, Elmoricq dis que j'ai plusieurs fonctions du meme nom... Ce n'est pas le cas, je veut dire les fonctions que j'ai declarees statiques ont toutes un nom unique.
Simplement, le compilo les voit plusieurs fois car elles sont _incluses_ plusieurs fois. Bref, je vais regarde si je peut desactiver juste ce warning.
Marsh Posté le 06-01-2009 à 22:48:05
guepe a écrit : |
Tu payes cher ton Ko sur disque ?
La compilation séparée c'est pas fait pour les lévriers ousbéques et répond à ton probleme qui est insoluble sinon.
Marsh Posté le 06-01-2009 à 22:48:17
guepe a écrit :
Par contre, Elmoricq dis que j'ai plusieurs fonctions du meme nom... Ce n'est pas le cas, je veut dire les fonctions que j'ai declarees statiques ont toutes un nom unique. |
Moins crade : tu ne mets QUE les prototypes de ces deux fonctions dans staticFunctions.h et, dans staticFunctions.cc, tu y colles l'implémentation.
Et voila, plus de problème, vu que tu as déjà staticFunctions.o dans la chaîne de linkage.
edit : ah ben JoelF m'a devancé en fait. J'ajouterais simplement que l'action de désactiver un warning, hormis cas particulier entièrement maîtrisé (je n'en ai pas encore croisé mais je veux bien croire qu'il y en a), c'est très souvent signe d'un problème d'implémentation.
Marsh Posté le 06-01-2009 à 22:59:29
Joel F a écrit : |
Ahhhhh... ah oui c'est vrai, creer le .o resoud mon probleme, j'avais completement oublie. J'avoue que j'ai plus ou moins tout appris tout seul, donc meme si je me debrouille pas trop mal j'ai des manques sur certains aspects...
Merci !
Marsh Posté le 07-01-2009 à 10:29:06
Joel F a écrit : euh pas de fonction dans des .h si elles ne sont pas inline svp :{ |
bah si c'est static ça pose pas de problème.
Marsh Posté le 07-01-2009 à 11:44:16
Taz a écrit :
|
sauf qu'apparemment si :E
sans compter le temps de compil qui gonfle pour rien et les dependances de compil quand tu change le corps de tes fonctions.
Marsh Posté le 07-01-2009 à 12:52:20
Joel F a écrit : |
ouais mais non. le static inline ça marche à cause du static, pas du inline.
Marsh Posté le 06-01-2009 à 21:13:31
Bonjour !
J'ai un programme c++ avec une petite serie de fonctions statiques groupees dans un fichier. Ces fonctions sont utilisees a de multiples endroits, dans de multiples objets, c'est tres pratique.
Sauf que, certains objets ne se servent pas de toutes les fonctions statiques declarees dans ce fichier, et pour chaque objet compile, chaque fonction statique declaree (incluse) mais non utilisee j'ai un warning : ca rend les compilations tres illisibles.
Y'aurait-il un moyen elegant face a cela ? Autre que declarer chaque fonction statique dans un fichier seul...
Merci !
---------------
Un blog qu'il est bien