Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1202 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Declaration de fonctions statiques, warning multiples

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Declaration de fonctions statiques, warning multiples

n°1834781
guepe
J'ai du noir sur la truffe ?
Posté le 06-01-2009 à 21:13:31  profilanswer
 

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
mood
Publicité
Posté le 06-01-2009 à 21:13:31  profilanswer
 

n°1834819
Joel F
Real men use unique_ptr
Posté le 06-01-2009 à 21:56:19  profilanswer
 

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

n°1834822
Elmoricq
Modérateur
Posté le 06-01-2009 à 22:02:47  profilanswer
 

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
n°1834823
guepe
J'ai du noir sur la truffe ?
Posté le 06-01-2009 à 22:03:13  profilanswer
 

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
n°1834824
Elmoricq
Modérateur
Posté le 06-01-2009 à 22:10:24  profilanswer
 

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.

n°1834829
guepe
J'ai du noir sur la truffe ?
Posté le 06-01-2009 à 22:19:13  profilanswer
 

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
n°1834832
Elmoricq
Modérateur
Posté le 06-01-2009 à 22:29:57  profilanswer
 

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
n°1834835
Joel F
Real men use unique_ptr
Posté le 06-01-2009 à 22:32:57  profilanswer
 

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

n°1834849
guepe
J'ai du noir sur la truffe ?
Posté le 06-01-2009 à 22:45:14  profilanswer
 

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
n°1834855
Joel F
Real men use unique_ptr
Posté le 06-01-2009 à 22:48:05  profilanswer
 

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.

mood
Publicité
Posté le 06-01-2009 à 22:48:05  profilanswer
 

n°1834856
Elmoricq
Modérateur
Posté le 06-01-2009 à 22:48:17  profilanswer
 

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
n°1834858
guepe
J'ai du noir sur la truffe ?
Posté le 06-01-2009 à 22:59:29  profilanswer
 

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
n°1834861
Joel F
Real men use unique_ptr
Posté le 06-01-2009 à 23:13:00  profilanswer
 

y a pas de mal :{

n°1834941
Taz
bisounours-codeur
Posté le 07-01-2009 à 10:29:06  profilanswer
 

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.

n°1834958
Joel F
Real men use unique_ptr
Posté le 07-01-2009 à 11:44:16  profilanswer
 

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
n°1834990
Taz
bisounours-codeur
Posté le 07-01-2009 à 12:52:20  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Declaration de fonctions statiques, warning multiples

 

Sujets relatifs
Monitoring de l'utilisation de fonctions javascriptRequetes avec jointures multiples
Warning que je ne comprends pas.[PHP] Warning: Cannot modify header information - headers already...
Déclaration de classeOccurence multiples dans chaine
comment bien gérer les parametres de fonctions en bash ?Recherche un mot clef pour les fonctions
PHP fonctions FTPFaire interprêter par le framework des fichiers statiques
Plus de sujets relatifs à : Declaration de fonctions statiques, warning multiples


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR