Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

enum et gcc?

12 réponses
Avatar
Laurent Deniau
La norme dit 6.7.2.2-2:

The expression that defines the value of an enumeration constant shall
be an integer constant expression that has a value representable as an int.

Or le programme ci-dessous affiche:

sizeof(e1) = 4 [4]
sizeof(e2) = 4 [4]
sizeof(e3) = 4 [4]
sizeof(e4) = 4 [4]
sizeof(e5) = 8 [8]
sizeof(e6) = 8 [8]

Les enumeration-constants ont la meme taille que les variables du meme
type alors qu'ils devraient avoir sizeof(int) (4 sur mon archi). Dans le
cas des long long, cela ne me semble pas correct, on devrait avoir soit
8 [4] (sous-optimal) soit 4 [4]. Explication?

a+, ld.

#include <stdio.h>
#include <limits.h>

enum { e1_ } e1;
enum { e2_ = -1 } e2;
enum { e3_ = LONG_MIN } e3;
enum { e4_ = ULONG_MAX } e4;
enum { e5_ = LLONG_MIN } e5;
enum { e6_ = ULLONG_MAX } e6;

#define PRINT(a) \
printf("sizeof(" #a ") = %zu [%zu]\n", sizeof(a), sizeof(a##_))

int
main(void)
{
PRINT(e1);
PRINT(e2);
PRINT(e3);
PRINT(e4);
PRINT(e5);
PRINT(e6);

return 0;
}

10 réponses

1 2
Avatar
Antoine Leca
En ck345j$3r1$, Laurent Deniau va escriure:
Or le programme ci-dessous affiche:


$ gcc -W -Wall -pedantic -stdÉ9 fclc.c
fclc.c:7: warning: ISO C restricts enumerator values to range of `int'
fclc.c:8: warning: ISO C restricts enumerator values to range of `int'
fclc.c:9: warning: ISO C restricts enumerator values to range of `int'


Les enumeration-constants ont la meme taille que les variables du meme
type


C'est une extension assez répandue de permettre des constantes de plus
grande amplitude. Évidemment, cela oblige le type enum à se promouvoir en
autre chose qu'un entier, et les constantes à être de type plus large.


Antoine

Avatar
Laurent Deniau
Antoine Leca wrote:
En ck345j$3r1$, Laurent Deniau va escriure:

Or le programme ci-dessous affiche:



$ gcc -W -Wall -pedantic -stdÉ9 fclc.c
fclc.c:7: warning: ISO C restricts enumerator values to range of `int'
fclc.c:8: warning: ISO C restricts enumerator values to range of `int'
fclc.c:9: warning: ISO C restricts enumerator values to range of `int'


Arf, j'avais oublie le pedantic. Des que je sors de mes makefiles je
deviens un handicape. Ok tout est clair.

Les enumeration-constants ont la meme taille que les variables du meme
type



C'est une extension assez répandue de permettre des constantes de plus
grande amplitude. Évidemment, cela oblige le type enum à se promouvoir en
autre chose qu'un entier, et les constantes à être de type plus large.


Decidement, enum est une vraie plaie pour la reflection.

a+, ld.


Avatar
Horst Kraemer
Laurent Deniau wrote:

Antoine Leca wrote:
En ck345j$3r1$, Laurent Deniau va escriure:

Or le programme ci-dessous affiche:



$ gcc -W -Wall -pedantic -stdÉ9 fclc.c
fclc.c:7: warning: ISO C restricts enumerator values to range of `int'
fclc.c:8: warning: ISO C restricts enumerator values to range of `int'
fclc.c:9: warning: ISO C restricts enumerator values to range of `int'


Arf, j'avais oublie le pedantic. Des que je sors de mes makefiles je
deviens un handicape. Ok tout est clair.

Les enumeration-constants ont la meme taille que les variables du meme
type



C'est une extension assez répandue de permettre des constantes de plus
grande amplitude. Évidemment, cela oblige le type enum à se promouvoir en
autre chose qu'un entier, et les constantes à être de type plus large.


Decidement, enum est une vraie plaie pour la reflection.


Selon la norme les enum sont simples. Les membres d'un type enum sont
des symboles pour des valeurs du type int et pour les objets
(variables) de ce type le compilateur a le droit de choisir un type
qui équivaut à un type entier quelconque capable de contenir toutes
les valeurs des membres de ce type.

--
Horst

--
Lâche pas la patate!



Avatar
Emmanuel Delahaye
Laurent Deniau wrote on 07/10/04 :
La norme dit 6.7.2.2-2:

The expression that defines the value of an enumeration constant shall be an
integer constant expression that has a value representable as an int.

enum { e3_ = LONG_MIN } e3;


Pas du C.

Comme indiqué ci-dessus, un enum doit être un int. Vérifie des
paramètres, tu ne dois pas être en mode ANSI strict.

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

Avatar
Emmanuel Delahaye
Laurent Deniau wrote on 07/10/04 :
Decidement, enum est une vraie plaie pour la reflection.


reflection de quoi dans quoi ?

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

Avatar
Emmanuel Delahaye
Horst Kraemer wrote on 07/10/04 :

Selon la norme les enum sont simples. Les membres d'un type enum sont
des symboles pour des valeurs du type int et pour les objets
(variables) de ce type le compilateur a le droit de choisir un type
qui équivaut à un type entier quelconque capable de contenir toutes
les valeurs des membres de ce type.


donc plus petit. Certains enums peuvent avoir une taille de char (1).

Dans mon Borland C, j'ai une option qui force les enums à int quelques
soient leurs valeurs.

+-[_]------------- Code Generation -----------------+
? ?
? Model Options ?
? ( ) Tiny [X] Treat enums as ints ?
? ( ) Small [ ] Word alignment ?
? ( ) Medium [X] Duplicate strings merged ?
? ( ) Compact [ ] Unsigned characters ?
? ( ) Large [ ] Pre-compiled headers ?
? ( ) Huge [ ] Generate assembler source ?
? [ ] Compile via assembler ?
? ?
? Assume SS Equals DS ?
? ( ) Default for memory model ?
? ( ) Never ?
? ( ) Always ?
? ?
? Defines ?
? ?
? OK _ Cancel _ Help _ ?
? ________ ________ ________ ?
+---------------------------------------------------+

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

Avatar
Laurent Deniau
Emmanuel Delahaye wrote:
Horst Kraemer wrote on 07/10/04 :

Selon la norme les enum sont simples. Les membres d'un type enum sont
des symboles pour des valeurs du type int et pour les objets
(variables) de ce type le compilateur a le droit de choisir un type
qui équivaut à un type entier quelconque capable de contenir toutes
les valeurs des membres de ce type.



donc plus petit. Certains enums peuvent avoir une taille de char (1).


exact, c'est pour ca que leur taille est imprevisible...

a+, ld.


Avatar
Laurent Deniau
Emmanuel Delahaye wrote:
Laurent Deniau wrote on 07/10/04 :

Decidement, enum est une vraie plaie pour la reflection.



reflection de quoi dans quoi ?


reflection/introspection des objets. OOC supporte la reflection sans une
seule ligne de code de la part du programmeur. Je pensais pouvoir
determiner automatiquement le type integral equivalent a un enum, mais
cela semble impossible. Je vais devoir faire autrement.

a+, ld.


Avatar
Charlie Gordon
reflection/introspection des objets. OOC supporte la reflection sans une
seule ligne de code de la part du programmeur. Je pensais pouvoir
determiner automatiquement le type integral equivalent a un enum, mais
cela semble impossible. Je vais devoir faire autrement.


Ce serait pas plutôt reflexion en français, un peu comme :

anglais: connection
français: connexion
anglais: French connection
français: filière américaine

Chqrlie.

Avatar
Laurent Deniau
Charlie Gordon wrote:
reflection/introspection des objets. OOC supporte la reflection sans une
seule ligne de code de la part du programmeur. Je pensais pouvoir
determiner automatiquement le type integral equivalent a un enum, mais
cela semble impossible. Je vais devoir faire autrement.



Ce serait pas plutôt reflexion en français, un peu comme :


A la reflexion, surement ;-)

a+, ld.


1 2