Declaration de fonctions statiques, warning multiples

Declaration de fonctions statiques, warning multiples - C++ - Programmation

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
Reply

Marsh Posté le 06-01-2009 à 21:13:31   

Reply

Marsh Posté le 06-01-2009 à 21:56:19    

hmmm montre un exemple je vois pas ce qui cloche là

Reply

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.


Message édité par Elmoricq le 06-01-2009 à 22:03:25
Reply

Marsh Posté le 06-01-2009 à 22:03:13    

Code :
  1. #ifndef __STATICFUNCTIONS_H__
  2. #define __STATICFUNCTIONS_H__
  3. #include <math.h>
  4. #include <iostream>
  5. #include "renderarea.h"
  6. #define NB_NANOPADS_PER_CELL 16
  7. //#define NANOPAD_SIZE 141 //80 //nanopad size in um
  8. #define DFT_CELL_SIZE 564 //defulat cell size in um
  9. #define DFT_RET_SIZE 16 //reticule 16*16 cell by default
  10. #define DFT_WIC_SIZE_X 3 //WIC size ret in X by default
  11. #define DFT_WIC_SIZE_Y 3 //WIC size ret in Y by default
  12. extern float CELL_SIZE_IN_PX;   //cell size in pixels
  13. extern int NANOPAD_SIZE;
  14. extern int NB_PARTITIONS_PIN_SPACING;
  15. extern float PIN_SPACING_CUT_FREQUENCY;
  16. /** Get pixel number for an equivalent distance in millimeters (mm)\
  17. We define 1 pixel on the screen= nanopad_size+spacingbetweennanoPads
  18.    * @param dist : distance in mm
  19.    * @param sbCellValue : cell size un um
  20.    * @return float : distance equivalence in pixels. Parameters from UI are taken to compute this.
  21.    */
  22. static float getNumPixel(float dist, double sbCellValue)
  23. {
  24.       int freeSpaceInCell=(int)(((float)sbCellValue-(float)sqrt(NB_NANOPADS_PER_CELL)*NANOPAD_SIZE)/((float)sqrt(NB_NANOPADS_PER_CELL)));
  25.       int pxSize_um=freeSpaceInCell+NANOPAD_SIZE;
  26.       CELL_SIZE_IN_PX=/*(int)*/((float)sbCellValue/((float)pxSize_um));
  27.      
  28.       return dist/(((float)freeSpaceInCell+NANOPAD_SIZE)/1000.0);
  29. }
  30. /** Get pixel number for an equivalent distance in millimeters (mm)\
  31. We define 1 pixel on the screen= nanopad_size
  32. * This makes the difference between getNumPixelWithoutSpacing and getNumPixel functions. It is used when working on identification
  33. * @param dist : distance in mm
  34. * @param sbCellValue : cell size un um
  35. * @return float : distance equivalence in pixels. Parameters from UI are taken to compute this.
  36. */
  37. static float getNumPixelWithoutSpacing(float dist, double sbCellValue)
  38. {
  39.    int freeSpaceInCell=(int)(((float)sbCellValue-(float)sqrt(NB_NANOPADS_PER_CELL)*NANOPAD_SIZE)/((float)sqrt(NB_NANOPADS_PER_CELL)));
  40.    int pxSize_um=freeSpaceInCell+NANOPAD_SIZE;
  41.    CELL_SIZE_IN_PX=/*(int)*/((float)sbCellValue/((float)pxSize_um));
  42.      
  43.    return dist/(NANOPAD_SIZE/1000.0);
  44. }


 
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 ?


---------------
Un blog qu'il est bien
Reply

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.

Reply

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".
 
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.


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 :
  1. g++ -Wl,-rpath,/export/tmp/srcDW/DreamWafer/trunk/software/install-qt-4.4.2/lib -o ../../bin/imgGenerator cell.o component.o dialogimpl.o ibisparser.o linearobject.o pin.o rectangularobject.o renderarea.o reticule.o staticFunctions.o staticwic.o uiclassifier.o main.o moc_dialogimpl.o moc_renderarea.o -L/export/tmp/srcDW/DreamWafer/trunk/software/install-qt-4.4.2/lib -lQtSql -L/export/tmp/srcDW/DreamWafer/trunk/software/install-qt-4.4.2/lib -pthread -L/lib -pthread -lQtGui -L/usr/X11R6/lib -pthread -lpng -lSM -lICE -pthread -pthread -lXi -lXrender -lXrandr -lfreetype -lfontconfig -lXext -lX11 -lQtCore -lz -lm -pthread -lgthread-2.0 -lglib-2.0 -lrt -lpthread -ldl
  2. dialogimpl.o: In function `getNumPixel(float, double)':
  3. /export/tmp/srcDW/DreamWafer/trunk/software/imgGenerator/imggkdevproject/src/../../../install-qt-4.4.2/include/QtCore/qglobal.h:1403: multiple definition of `getNumPixel(float, double)'
  4. component.o:/export/tmp/srcDW/DreamWafer/trunk/software/imgGenerator/imggkdevproject/src/staticFunctions.h:25: first defined here
  5. ibisparser.o: In function `getNumPixel(float, double)':
  6. /export/tmp/srcDW/DreamWafer/trunk/software/imgGenerator/imggkdevproject/src/../../../install-qt-4.4.2/include/QtCore/qglobal.h:1403: multiple definition of `getNumPixel(float, double)'
  7. component.o:/export/tmp/srcDW/DreamWafer/trunk/software/imgGenerator/imggkdevproject/src/staticFunctions.h:25: first defined here
  8. linearobject.o: In function `getNumPixel(float, double)':
  9. .......... etc.........


---------------
Un blog qu'il est bien
Reply

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)


Message édité par Elmoricq le 06-01-2009 à 22:39:08
Reply

Marsh Posté le 06-01-2009 à 22:32:57    

euh pas de fonction dans des .h si elles ne sont pas inline svp :{

Reply

Marsh 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.


---------------
Un blog qu'il est bien
Reply

Marsh Posté le 06-01-2009 à 22:48:05    

guepe a écrit :


En meme temps, utiliser un .cpp pour 6 fonctions qui sont toutes uniques.


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.

Reply

Marsh Posté le 06-01-2009 à 22:48:05   

Reply

Marsh Posté le 06-01-2009 à 22:48:17    

guepe a écrit :


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.

 

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.


Message édité par Elmoricq le 06-01-2009 à 22:49:26
Reply

Marsh Posté le 06-01-2009 à 22:59:29    

Joel F 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.


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  :o  j'ai des manques sur certains aspects...
Merci !


---------------
Un blog qu'il est bien
Reply

Marsh Posté le 06-01-2009 à 23:13:00    

y a pas de mal :{

Reply

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.

Reply

Marsh Posté le 07-01-2009 à 11:44:16    

Taz a écrit :


bah si c'est static ça pose pas de problème.


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.

Message cité 1 fois
Message édité par Joel F le 07-01-2009 à 11:44:46
Reply

Marsh Posté le 07-01-2009 à 12:52:20    

Joel F 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.


ouais mais non. le static inline ça marche à cause du static, pas du inline.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed