Initialisation "bizarre" en C

damocles31

Habitué
bonsoir,

au travail aujourd'hui j'ai rencontré une forme d'initialisation "bizarre" d'une variable de type simple. Le compilateur ne s'en offusque pas et ne daigne même pas sortir un warning :)

alors voici un exemple pour reproduire (simplifié par rapport à notre appli).

[cpp]
int main(int argc, char ** argv)
{
int t = (10, 20);

return 0;
}
[/cpp]

Quelqu'un pourrait-il m'expliquer comment le compilateur interprète ça ? que vaut "t" et pourquoi surtout ?
Compilateurs/environnements testés : gcc sous Linux, Microsoft Visual C++ 6.0 et Microsoft eMbedded C++ 4.2.

Note : j'ai retrouvé le développeur responsable de ce code... en fait il s'agit d'une erreur de sa part, on a de la chance que cela fonctionne :pfff:

Merci d'avance !
 

zeb

Modérateur
Testé sous "C for AIX Compiler, Version 6". Pas de warning. La variable contient toujours le dernier entier du tableau. Pas encore de réponse.

A suivre..
 

Emmanuel Delahaye

Expert

Le message de gcc est assez clair :
[cpp]
#include<stdio.h>

int main (void)
{
int t = (10, 20);

printf ("t=%d\n", t);
return 0;
}
[/cpp]
[fixed]
../main.c: In function `main_':
../main.c:5: warning: left-hand operand of comma expression has no effect
[/fixed]
Une expression avec l'opérateur 'virgule' est évaluée de gauche à droite. Seule la valeur de l'opérande le plus à droite est retourné.
 

Emmanuel Delahaye

Expert
Ne plus douter : GCC est bien le meilleur compilo.
Tu parles probablement de gcc, car GCC, c'est la Gnu Compiler Collection... à ne pas confondre avec gcc qui est le Gnu C Compiler. Oui, c'est subtil mais gens de Gnu sont comme ça...

Effectivement, gcc a un bon système de warning... quand on sait le configurer...

Dans le genre, le compilateur Intel (icc) est aussi remarquable !
 

damocles31

Habitué
merci :)
avec un warning c'est tout de suite plus compréhensible...

d'ailleurs, quelles options de compilation utilisez-vous ? Nous on n'utilise que -ansi, et ça ne semble pas suffisant...

voici les infos de gcc :

[cpp]
: gcc -v
Lecture des spécification à partir de /usr/lib/gcc-lib/i386-redhat-linux/3.2.3/specs
Configuré avec: ../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --enable-shared --enable-threads=posix
--disable-checking --with-system-zlib --enable-__cxa_atexit
--host=i386-redhat-linux
Modèle de thread: posix
version gcc 3.2.3 20030502 (Red Hat Linux 3.2.3-42)
:
[/cpp]

merci encore pour la réponse
 

Emmanuel Delahaye

Expert

Au minimum
[fixed]-Wall -Wextra -O2 -ansi[/fixed]
ou
[fixed]-Wall -W -O2 -ansi[/fixed]
avec les versions anciennes.

J'ai aussi un mode paranoïaque à 36 paramètres...
[fixed]
-O2 -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int -Werror-implicit-function-declaration -Wmain -Wparentheses -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings -Wconversion -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wmissing-noreturn -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-long
[/fixed]
 

damocles31

Habitué
merci, je pense que je vais proposer la mise à jour de nos makefiles...
par contre, comme on développe aussi pour Windows CE, là on reste aux options limitées de eMbedded.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 135
Messages
6 718 107
Membres
1 586 397
Dernier membre
Chachabidou
Partager cette page
Haut