IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

probleme avec static inline


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut probleme avec static inline
    Bonjour
    Je cherche a compiler sous VC2005 un fichier source .c a la base programmé pour compiler en sous GCC, qui contient ce simple bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    static inline
    void initialise(gsl_integration_workspace* workspace, double a, double b);
    }
    quand ca compile, voici le message d'erreur qui apparait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    error C2143: erreur de syntaxe : absence de ')' avant '*'
     error C2143: erreur de syntaxe : absence de '{' avant '*'
     error C2059: erreur de syntaxe : 'type'
     error C2059: erreur de syntaxe : ')'
    je pense que l'erreur vient du fait que VC2005 ne connait pas: static inline (c'est ce que j'ai compris d'apres mes recherces sur internet)
    que puis-je faire pour convertir ce simple bout de code pour que VC2005 puisse le comprendre?
    merci

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Je crois plutot que le probleme vient que inline n'existe pas en C, si ma memoire est bonne. Peut etre __inline...

  3. #3
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    merci, j'ai essayé, mais ca donne tj la meme erreur.
    peut etre faut il essayer un truc dans le style des extern, #IFDEFINe...

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Peo,

    Il faudrait un peu plus de code, car là, à voir ce que tu nous montres, tu as une accolade fermante qui n'a rien à faire ici (mais il faut voir le code précédent ce que tu as mis).
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    ben voila le code du fichier entier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    /* integration/initialise.c
     * 
     * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2007 Brian Gough
     * 
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation; either version 3 of the License, or (at
     * your option) any later version.
     * 
     * This program is distributed in the hope that it will be useful, but
     * WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     * General Public License for more details.
     * 
     * You should have received a copy of the GNU General Public License
     * along with this program; if not, write to the Free Software
     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
     */
    static inline
    void initialise(gsl_integration_workspace* workspace, double a, double b);
     
    static inline
    void initialise (gsl_integration_workspace * workspace, double a, double b)
    {
      workspace->size = 0;
      workspace->nrmax = 0;
      workspace->i = 0;
      workspace->alist[0] = a;
      workspace->blist[0] = b;
      workspace->rlist[0] = 0.0;
      workspace->elist[0] = 0.0;
      workspace->order[0] = 0;
      workspace->level[0] = 0;
     
      workspace->maximum_level = 0;
    }
    ensuite ce fichier est utilisé par d'autres fichiers comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <conssfig.h>
    #include <stdlib.h>
    #include <gsl_math.h>
    #include <gsl_errno.h>
    #include <gsl_integration.h>
     
     
    #include "set_initial.c"
    #include "qpsrt.c"
    #include "util.c"
    #include "initialise.c"....................
    mais est-ce un problème de code ou de compilateur?

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Ah !!!!!!!!!!!!!! Des inclusions de .c ! beurk.
    Va revoir le principe de programmation modulaire.

    Comment ca peut compiler sans donner des erreurs de multiples definitions ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    L'erreur vient du fait que gsl_integration_workspace est inconnu, pas du static inline.

    Regarde ta liste d'erreur de nouveau:
    * error C2143: erreur de syntaxe : absence de ')' avant '*'
    --> clairement, pour que le * lui pose problème, il faut qu'il y ait un problème avant
    error C2143: erreur de syntaxe : absence de '{' avant '*'
    --> idem
    error C2059: erreur de syntaxe : 'type'
    --> oh, serait-ce un problème de type ? Mais quel type est donc utilisé sur la même ligne ?

    Je pense que tu as soit un problème de header guard, soit une erreur dans le nom du type (quelque part). En tout cas, le problème est là - 99% de chance
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  8. #8
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Oui, c'est cela. Tout ca vient de la GNU scientifique librairy. qui doit tourner sur GCC. Moi j'ai VC2005. J'ai du faire des modifications.
    Notamment mettre les header ou est définit le type qui faisait planté la compilation.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Je ne sais pas pour le reste, mais inline est bien supposé causer une erreur. Il s'agit d'une fonctionnalité du C99, supportée par GCC mais pas par Visual C++. Ce n'est pas la première fois que je vois une biblio ne pouvant compiler à cause de cette spécificité. Change le static inline en static et ça devrait aller un peu mieux.

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    C'est le même problème qu'ici et ce n'est pas le compilateur qui en est la cause mais le type non défini comme l'explique Emmanuel...
    Manifestement tu n'es pas supposé compiler ce fichier directement mais compiler des fichiers qui eux l'inclus, en ayant au préalable inclus les .h qui vont bien (ceux qui commencent par gsl_ donc).
    Alors oui, c'est pas très malin de la part de GSL d'avoir organisé leur code comme ça, mais il faut aussi réfléchir un peu 2 mn : si tu ne mets aucun include il n'y a aucune chance que tu puisses utiliser du code d'une bibliothèque externe (enfin sauf en passant par des precompiled headers, ok)...
    Donc là rajoute déjà au début du fichier que tu as bidouillé quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <gsl_math.h>
    #include <gsl_errno.h>
    #include <gsl_integration.h>
    Après il y aura sans doute aussi un problème d'intégration de code C dans du C++ à régler, c'est sûr.

    Cela dit comment as-tu compilé GSL à la base ? Avec Cygwin puisque ça semble être la seule plate-forme supportée sous Windows ?

    MAT.

  11. #11
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Ah !!!!!!!!!!!!!! Des inclusions de .c ! beurk.
    Va revoir le principe de programmation modulaire.

    Comment ca peut compiler sans donner des erreurs de multiples definitions ?
    Il m'est déjà arrivé d'inclure des .cpp lorsque je voulais rassembler des instanciations explicites de templates pour compiler une dll par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // IntanciationsExplicites.cpp
     
    #include <Moteur.cpp>
    #include <Renderer.cpp>
     
    template Moteur<Win32>;
    template Renderer<OpenGL>;
    template Renderer<DirectX>;

  12. #12
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Bah dans ce cas on nomme pas son fichier en .cpp.
    On le nomme en .tpl ou en ce que tu veux mais pas .cpp. Même si au final ca va rien chnager pour le pré-processeur, c'est "par principe".

    Enfin bon, là ca m'étonerai qu'il travaille avec des templates, surtou qu'il bosse avec du C
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  13. #13
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Oui on peut tout à fait les nommer .tpl dans ce cas bien que je perde l'avantage de la coloration syntaxique que m'offre l'extension cpp ainsi que la complétion.

    Deuxième inconvénient : dans l'exemple j'ai cru bon de regrouper les instanciations car elles se reportaient au même thème.
    Si je n'ai qu'un seul template à instancier, je le fait directement dans le cpp qui contient l'implémentation, et là, il faut qu'il ait l'extension .cpp pour être compilé. Donc par cohérence, je garde partout .cpp.

  14. #14
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Oui on peut tout à fait les nommer .tpl dans ce cas bien que je perde l'avantage de la coloration syntaxique que m'offre l'extension cpp ainsi que la complétion.
    Euh, ca osef un peu.Suffit de régler ton éditeur hein
    Deuxième inconvénient : dans l'exemple j'ai cru bon de regrouper les instanciations car elles se reportaient au même thème.
    Si je n'ai qu'un seul template à instancier, je le fait directement dans le cpp qui contient l'implémentation, et là, il faut qu'il ait l'extension .cpp pour être compilé. Donc par cohérence, je garde partout .cpp.
    Là je comprend très bien.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  15. #15
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Peut-être qu'il existe aussi une option dans le projet qui dirait de compiler les tpl comme des cpp, mais ça devient moins portable comme solution.

  16. #16
    Membre confirmé
    Avatar de NewbiZ
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2002
    Messages : 184
    Points : 563
    Points
    563
    Par défaut
    C'est à ca que servent .inl et .hxx

  17. #17
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    merci pour les rep

    Cela dit comment as-tu compilé GSL à la base ? Avec Cygwin puisque ça semble être la seule plate-forme supportée sous Windows ?
    Non avec visual 2005. Bien sur, j'ai du bidouiller l'ensemble du code. Mais ca fonctionne. Au depart, c'est fait pour etre compiler sur GCC et comme il y a des trucs qui ne fonctionnennt pas sous Visual 2005, je suis obligé de manipuler le code. Notamment "inline".
    Mais je n'ai pas compiler GSL, seulement certains fichiers de GSL.


    Puisqu'on parle de .cpp/.c, quel sont les risques si dans un projet C++ sous VC2005, on melange des fichiers cpp et .c?

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je dirais aucun risque si c'est fait correctement (extern "C", pas de code C dans les fichiers .cpp, pas de code C++ dans les fichiers .c...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Il m'est déjà arrivé d'inclure des .cpp lorsque je voulais rassembler des instanciations explicites de templates pour compiler une dll
    Je vois pas trop le rapport avec une dll. Les templates et les dlls se marient mal.
    Les instanciations explicites de template, en general, c'est mauvais signe. Le code de ton template doit etre dans le .h, c'est pas top, mais c'est ainsi (tant que export n'est pas plus largement supporte).
    Tu peux le mettre dans un .tpp que tu inclus a la fin du .h (voir FAQ), mais au final, le code de ton template doit etre inclus en totalite via le .h.

  20. #20
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    C'est pas mauvais signe, c'est juste très rare. Qui dit template ne dit pas "doitforcémentmarcherpourni'mportequeltypeutilisateur". On pense parfois un template pour deux ou trois types bien identifiés. Rien n'empêche alors de ne proposer que ces types au moment du link. L'instanciation explicite est l'outil qui permet de faire cela en laissant toute l'implémentation du template hors du .h et les DLL s'en portent à merveille.

    Tu vois il est peu probable qu'un développeur ait un jour l'idée d'écrire Renderer<int>. Une classe template, une fois instanciée pour un type, n'est rien d'autre qu'une classe normale. A partir de là, tout est possible, DLL inclues.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. probleme avec Static
    Par asprog dans le forum Débuter
    Réponses: 2
    Dernier message: 27/01/2011, 22h20
  2. probleme avec une methode static dans le body d'une jsp
    Par amadou.deme dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 19/02/2007, 08h47
  3. [POO] Problème avec une variable static
    Par grimsk dans le forum Langage
    Réponses: 5
    Dernier message: 23/05/2006, 01h58
  4. [POO] Probleme avec static et autoload
    Par laetyboop dans le forum Langage
    Réponses: 1
    Dernier message: 23/03/2006, 14h46
  5. Problème avec l'option -static de gcc
    Par lsdInside dans le forum Linux
    Réponses: 2
    Dernier message: 08/05/2004, 01h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo