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 :

différences de syntaxe entre gcc et visual C?


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 69
    Points : 75
    Points
    75
    Par défaut différences de syntaxe entre gcc et visual C?
    Salut,
    je débute une formation à l'iut qui utilise comme compilo celui de microsoft
    et en essayant de faire tourner les algos vu en cours avec gcc chez moi ça fait déjà 2 fois que je trouve des différences entre les deux

    1ere
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void main() // refusé catégoriquement par gcc et pas par visual
    2em
    dans un petit TD (annuaire primitif) je dois utilisé une structure
    je crée donc ma strucuture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct fiche{
    ...
    };
    void main()
    {
    fiche contact[100]; //refusé par visual alors que gcc le prend
    qui a raison de microsoft ou de gcc, qui ne respecte pas les standards?
    et surtout existe t il une listes des différences entre la syntaxe des deux compilo?

  2. #2
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Pour 'main':

    Citation Envoyé par n1362
    The function called at program startup is named main. The implementation declares no
    prototype for this function. It shall be defined with a return type of int and with no
    parameters:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            int main(void) { /* ... */ }
    or with two parameters (referred to here as argc and argv, though any names may be
    used, as they are local to the function in which they are declared):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            int main(int argc, char *argv[]) { /* ... */ }
    Pour ce qui est de ta structure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
             struct tnode {
                      int count;
                      struct tnode *left, *right;
             };
    specifies a structure that contains an integer and two pointers to objects of the same type. Once this
    declaration has been given, the declaration
    declares s to be an object of the given type and sp to be a pointer to an object of the given type.
    Ton code devrait donc être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct fiche
    {
    };
     
    int main()
    {
    	struct fiche contact[100];
    }
    Ou bien:

    The following alternative formulation uses the typedef mechanism:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct tnode TNODE;
    struct tnode {
          int count;
          TNODE *left, *right;
    };
    TNODE s, *sp;
    Qui peut se raccourcir, si ta structure ne pointe pas sur elle même:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct {/*...*/} fiche;
    int main()
    {
    	fiche contact[100]; 
    }
    GCC a donc parfaitement raison !

    Je souhaite cependant noter, que la notation suivante est admise en C++ (et non en C !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct fiche { /*...*/ };
    fiche contact;

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Pour faire court et simple, si tu cherches le standard des standard, passe sur GCC ou éventuellement sur MingW si tu es sur Windows, Microsoft ne suit jamais le standard, ils font toujours plus ou moins à leur sauce !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Concernant le main() je te renvoie à l'explication de JulienDuSud. Sachant tout de même que la norme permet à une implémentation donnée de d'utiliser d'autre forme pour le main.

    Concernant la structure, es-tu sur de bien compiler en C et non en C++ (extension du fichier, option du projet, etc.) ?

  5. #5
    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 518
    Points
    41 518
    Par défaut
    Citation Envoyé par jlandrei Voir le message
    2em
    dans un petit TD (annuaire primitif) je dois utilisé une structure
    je crée donc ma strucuture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct fiche{
    ...
    };
    void main()
    {
    fiche contact[100]; //refusé par visual alors que gcc le prend
    Es-tu sûr que tu compiles bien en C et pas en 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.

  6. #6
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Es-tu sûr que tu compiles bien en C et pas en C++?
    c'est normal que son code ne compile pas.
    En ANSI C90, la déclaration d'une variable de type structure doit se faire avec le mot clé "struct"... Sur ce point, Visual studio (pour une fois) est conforme.

    Par contre si un typedef est crée pour la structure avec le même nom, alors le mot clé 'struct' devient inutile en raison du typedef...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  7. #7
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    Pour faire court et simple, si tu cherches le standard des standard, passe sur GCC ou éventuellement sur MingW si tu es sur Windows, Microsoft ne suit jamais le standard, ils font toujours plus ou moins à leur sauce !
    Hum... Franck, raccourci facile et tellement court qu'il en devient désinformatif.

    le compilo C de MS est toute même fortement compliant au C90.
    A part quelques broutilles, il est est même totalement compliant au C90.
    OK, Microsoft a choisi de ne pas se conformer au C99 (et pour ma part , je ne les en blame pas, si ce n'est pour les macros variadiques)

    Je ne suis en aucun cas pro microsoft, tres loin de la.... mais on peut pas dire "Microsoft ne suit jamais le standard, ils font toujours plus ou moins à leur sauce"....
    Parce qu'aussi, les standards, des fois, ils se font attendre et pendant ce temps, les compilos doivent evoluer (exemple wchar_t officiellement et tardivement introduit en 95)...
    GCC a une ribambelle d'extension exotiques propre à lui et fait donc a sa sauce...
    Mais ca, ca gène pas....chercher l'erreur ...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Vincent Rogier Voir le message
    c'est normal que son code ne compile pas.
    En ANSI C90, la déclaration d'une variable de type structure doit se faire avec le mot clé "struct"... Sur ce point, Visual studio (pour une fois) est conforme.
    Tout à fait.

    Mais comme gcc est également conforme sur ce point, la question C ou C++ se pose réellement (sachant qu'en C++ la syntaxe sans le struct est tout à fait correcte)

  9. #9
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par gl Voir le message
    Tout à fait.

    Mais comme gcc est également conforme sur ce point, la question C ou C++ se pose réellement (sachant qu'en C++ la syntaxe sans le struct est tout à fait correcte)
    Si on regarde le code posté par le PO :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct fiche{
    ...
    };
    void main()
    {
    fiche contact[100]; //refusé par visual alors que gcc le prend
    Ce code ne compile par sous VS quelque soit les options de compilation.
    Maintenant, s'il compile sous GCC, il faut plutot voir les options passés au compilo.
    A moins que le PO utilise g++ et pas gcc en commande et la on est tous en train de perdre notre temps.
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  10. #10
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Citation Envoyé par Vincent Rogier Voir le message
    Maintenant, s'il compile sous GCC, il faut plutot voir les options passés au compilo.
    A moins que le PO utilise g++ et pas gcc en commande et la on est tous en train de perdre notre temps.
    Ce code ne compile pas chez moi sans paramètres aucunes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct a {};
     
    int main() 
    { 
    	a A; 
    	return 0; 
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    gcc -o "test" "test.c" (in directory: /home/pseudo/Desktop)
    test.c: In function ‘main’:
    test.c:5: error: ‘a’ undeclared (first use in this function)
    test.c:5: error: (Each undeclared identifier is reported only once
    test.c:5: error: for each function it appears in.)
    test.c:5: error: expected ‘;’ before ‘A’
    Compilation failed.
    imo, il utilise bien un compilateur C++ pour qu'il l'accepte sans paramètres.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 69
    Points : 75
    Points
    75
    Par défaut
    j'utilise code::bloc comme éditeur qui utilise mingW qui est si je ne me trompe la version windows de gcc.
    qd j'utilise c::b je lui dis que je fait du C. apres les options qu'il utilise, j'ai pas regardé.


    A l'iut descartes, ils ont vs2005. j'attend d'avoir ma carte etudiant (en janvier) pour telecharger les memes outils qu'eux (ca va me faire bizarre d'avoir une carte d'etudiant à 34 ans )
    en vs2005 pas moyen de lui dire que je fait du C...

    connaissez vous un endroit ou je pourrais voir les différences de syntaxe entre les deux compillos.j'en ai trouvé 2 cas mais je pense qu'il doit y en avoir d'autres, ou dois-je attendre sur les cas où ca va coincer?

  12. #12
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Citation Envoyé par jlandrei Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct fiche{
    ...
    };
    void main()
    {
    fiche contact[100]; //refusé par visual alors que gcc le prend
    Tu es sûr que c'est pas accepté par GCC mais accepté par Visual ?

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 69
    Points : 75
    Points
    75
    Par défaut
    le void main est refusé dans gcc(mingw) mais celui avec la déclaration d'une variable de type struct juste avec avec le nom du type marche tres bien.
    mais accepte aussi l'utilisation du mot struct au début, donc je vais utiliser struct devant car les 2 compilo comprennent ça.

  14. #14
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par jlandrei Voir le message
    le void main est refusé dans gcc(mingw) mais celui avec la déclaration d'une variable de type struct juste avec avec le nom du type marche tres bien.
    mais accepte aussi l'utilisation du mot struct au début, donc je vais utiliser struct devant car les 2 compilo comprennent ça.
    Pas en C. Ce compilateur (mingw) n'admet pas, et c'est normal, l'absence du mot-clé struct.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. Différence d'execution entre Visual Studio et Windows
    Par podidoo dans le forum Visual C++
    Réponses: 4
    Dernier message: 16/06/2009, 14h00
  2. Grosse différence de perf en GCC et Visual avec les STL
    Par vanitom dans le forum Visual C++
    Réponses: 4
    Dernier message: 28/04/2009, 09h35
  3. Quelles différences entre les dossiers Visual Studio ?
    Par soso78 dans le forum Visual Studio
    Réponses: 2
    Dernier message: 03/02/2009, 14h32
  4. Réponses: 1
    Dernier message: 01/07/2008, 22h25
  5. différences de syntaxe entre mysql 4 et 5
    Par bigsister dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/10/2007, 20h18

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