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

struct vide

16 réponses
Avatar
Laurent Deniau
Est-ce que vous connaitriez un moyen de declarer une structure vide sans
declancher un warning de la part du compilateur?

J'ai essaye

struct A {}
et
struct A {int :0;}

mais dans les deux cas j'ai un warning avec gcc (et je ne sais pas
comment le desactiver). Y aurait il une astuce sur le marche pour eviter ca?

a+, ld.

6 réponses

1 2
Avatar
Laurent Deniau
Gabriel Dos Reis wrote:
Laurent Deniau writes:

| Est-ce que vous connaitriez un moyen de declarer une structure vide
| sans declancher un warning de la part du compilateur?

C'est invalide en C, alors...
Du moins, si je comprends bien ce que tu appelles « struct vide ».


Oui, je pense que tu comprends bien ce que j'appelle "struct vide" ;-)

struct A { /* vide */ };

Et effectivement

struct A { char _[0]; };

est invalide. Je decouvre que le 1er cas aussi est invalide, ce qui
empeche de creer un nouveau type simple (utile en C en l'absence de
specialisation?).

a+, ld.

Avatar
Laurent Deniau
Marc Espie wrote:
In article <eo09ut$73j$,
Laurent Deniau wrote:

NIL
<- Nil (root/subclass of all class)
<- Any (root class of atoms)
<- TrueFalse (class)
<- True (class)
<- False (class)
<- Object (root class of instances)
<- Method +[1234] (class)
<- Behavior (class)
<- Generic (class)
<- Class (class)
<- MetaClass (class)
<- PropertyClass (class)
<- cNil (meta class)
<- pNil (property class)
<- cTrueFalse (meta class)
<- pTrueFalse (property class)
<- cTrue (meta class)
<- pTrue (property class)
<- cFalse (meta class)
<- pFalse (property class)
<- cObject (meta class)


[...]


Oh, le joli sapin.


J'avais enleve les guirlandes, mais je peux les remettres si tu veux.

Joyeux Noel a toi-aussi.


Pareil, joyeux Noel 2007.

(desole, j'ai pas pu resister).


moi non plus.

a+, ld.


Avatar
Gabriel Dos Reis
Laurent Deniau writes:

| Gabriel Dos Reis wrote:
| > Laurent Deniau writes:
| > | Est-ce que vous connaitriez un moyen de declarer une structure vide
| > | sans declancher un warning de la part du compilateur?
| > C'est invalide en C, alors...
| > Du moins, si je comprends bien ce que tu appelles « struct vide ».
|
| Oui, je pense que tu comprends bien ce que j'appelle "struct vide" ;-)
|
| struct A { /* vide */ };
|
| Et effectivement
|
| struct A { char _[0]; };
|
| est invalide. Je decouvre que le 1er cas aussi est invalide, ce qui
| empeche de creer un nouveau type simple (utile en C en l'absence de
| specialisation?).

Les programmeurs C ont toujours quelque chose à mettre dans un struct ;-)

Franchement, je n'ai jamais compris cette restriction, mais j'ai
appris que c'est une restriction dont certains sont fiers...

-- Gaby
Avatar
Nicolas Joseph
Bonjour,

En C99 il y a :
struct incomplet
{
int n;
int tab[];
};

Mais :

1. Je ne sais pas si le premier champs est optionnel
2. Ton framework est en C90 je crois
Avatar
Laurent Deniau
Bonjour,

En C99 il y a :
struct incomplet
{
int n;
int tab[];
};

Mais :

1. Je ne sais pas si le premier champs est optionnel


Il est effectivement necessaire et de plus flexible array tab doit etre
le dernier champ de la structure (c99 6.7.2.1-16) ce qui n'est en fait
jamais mon cas.

2. Ton framework est en C90 je crois


Non, le "nouveau" est en C99 (j'ai besoin de qques fonctionnalites
specifiques a C99).

Mais j'ai finalement resolu le probleme autrement. Je me suis dis que
ce probleme etait peut-etre du a un probleme de design (aucun objet ne
devrait etre vide) et j'ai donc revu ce point.

merci,

a+, ld.

Avatar
Antoine Leca
Bonjour à tous (comme cela faisait longtemps...)

Laurent Deniau wrote:
Gabriel Dos Reis wrote:
Laurent Deniau writes:

Est-ce que vous connaitriez un moyen de declarer une structure vide
sans declancher un warning de la part du compilateur?




Supprimer les warnings au niveau de la ligne de commandes? :-)))


C'est invalide en C, alors...



Yep.

Du moins, si je comprends bien ce que tu appelles « struct vide ».



void ?

Oui, je pense que tu comprends bien ce que j'appelle "struct vide" ;-)

struct A { /* vide */ };

Et effectivement

struct A { char _[0]; };

est invalide. Je decouvre que le 1er cas aussi est invalide, ce qui
empeche de creer un nouveau type simple


Yep.


(utile en C en l'absence de specialisation?).


Euh, pour quoi faire? (OK, j'ai lu ta réponse du 13, pas besoin de répéter
inutilement)

- tu ne peux pas créer d'objet de ce type (en C un objet doit avoir une
taille non nulle)

- tu ne peux pas dériver de classe, cette notion est absente du C (il faut
prendre un autre langage, par exemple Delphi ou Ada95 ou que sais-je)

- si tu veux créer un type pointeur vers structure compatible,
union{unsigned char _;} est suffisant (d'après 6.2.5p26ss).
void* est pas mal non plus. :-)


Sinon, utiliser une structure sans la définir doit pouvoir marcher dans
certains cas. Par exemple

struct vide;

Et pas de définition de struct vide, elle se comportera alors d'une manière
très similaire à une structure vide.
Note: Avec les compilos Borland, il faut passer -w-stu pour désactiver un
pénible avertissement inutile.


Antoine



1 2