C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Signature de struct
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Thierry Noc
Guest





PostPosted: Mon Sep 15, 2003 5:14 pm    Post subject: Signature de struct Reply with quote



Bonjour tlm,

Je rapplique avec une question pas très sexy, désolé.


Si j'ai une lib en C que je veux utiliser en C++, et que la lib n'a pas été
conçue pour C++, la solution est de retoucher les headers de la lib et de
rajouter des :
#ifdef __cplusplus
extern "C" {
#endif
dans tous les .h.

Si dans cette lib, y'a une struct avec un membre qui s'appelle operator. ex:

struct st {
int operator;
};

Est-ce que c'est correct de faire:

#ifdef __cplusplus
extern "C" {
#endif

struct st {
#ifdef __cplusplus
int xoperator; // operator est un mot clé réservé en C++
#else
int operator;
#endif
};

#ifdef __cplusplus
}
#endif

Autrement dit, est-ce que une structure n'aurait pas une espèce de signature
(comme une fonction) qui ferait intervenir le nom des membres, et qui
empêcherait de l'utiliser si on la falsifie. (d'après la norme, et d'après
la réalité du terrain).


Autre question:

sur un :
typedef char * charptr;
ou :
typedef struct st *structptr;

est-il nécessaire d'encadrer ces typedefs d'un extern "C" ?

--



Back to top
Gabriel Dos Reis
Guest





PostPosted: Mon Sep 15, 2003 5:42 pm    Post subject: Re: Signature de struct Reply with quote



"Thierry Noc" <svill (AT) free (DOT) fr> writes:

Quote:
Si dans cette lib, y'a une struct avec un membre qui s'appelle operator. ex:

struct st {
int operator;

c'est ce qu'on appelle chercher des ennuis.

Quote:
Est-ce que c'est correct de faire:

c'est répandu (par exemple dans les en-têtes de la X lib) mais c'est
incorrect -- une violation de l'ODR.


Quote:
struct st {
#ifdef __cplusplus
int xoperator; // operator est un mot clé réservé en C++
#else
int operator;
#endif
};

Autrement dit, est-ce que une structure n'aurait pas une espèce de signature
(comme une fonction) qui ferait intervenir le nom des membres, et qui
empêcherait de l'utiliser si on la falsifie. (d'après la norme, et d'après
la réalité du terrain).

C'est là où intervient l'ODR (One Definition Rule) qui dit que deux
classes sont les mêmes si et seulement si les suites de tokens en
correspondance biunivoque.
3.2/5
[...] Given such an entity named D defined in more than one
translation unit, then
-- each definition of D shall consist of the same sequence of
tokens; and
[...]

Si tu violes cette règle simple, alors...

Quote:
Autre question:

sur un :
typedef char * charptr;
ou :
typedef struct st *structptr;

est-il nécessaire d'encadrer ces typedefs d'un extern "C" ?

Yep.

-- Gaby

Back to top
Michaël Monerau
Guest





PostPosted: Mon Sep 15, 2003 5:57 pm    Post subject: Re: Signature de struct Reply with quote



Gabriel Dos Reis wrote:
Quote:
struct st {
#ifdef __cplusplus
int xoperator; // operator est un mot clé réservé
en C++ #else
int operator;
#endif
};

Autrement dit, est-ce que une structure n'aurait pas une espèce de
signature (comme une fonction) qui ferait intervenir le nom des
membres, et qui empêcherait de l'utiliser si on la falsifie.
(d'après la norme, et d'après la réalité du terrain).

C'est là où intervient l'ODR (One Definition Rule) qui dit que deux
classes sont les mêmes si et seulement si les suites de tokens en
correspondance biunivoque.
3.2/5
[...] Given such an entity named D defined in more than one
translation unit, then
-- each definition of D shall consist of the same sequence of
tokens; and
[...]

Si tu violes cette règle simple, alors...

Je ne comprends pas bien le pourquoi de l'erreur. Je suppose qu'il va
maintenant compiler TOUS le headers modifiés avec un compilateur C++, donc
tout le projet utilisera la définition `__cplusplus', donc toutes les
définitions de la classe auront le même membre, ce qui ne me semble pas
violer l'ODR (le préprocesseur se chargera de virer la partie C).

Merci de m'éclairer !
--
<=- Michaël "Cortex" Monerau -=>



Back to top
Gabriel Dos Reis
Guest





PostPosted: Mon Sep 15, 2003 6:03 pm    Post subject: Re: Signature de struct Reply with quote

"Michaël Monerau" <cort (AT) meloo (DOT) com> writes:

Quote:
Si tu violes cette règle simple, alors...

Je ne comprends pas bien le pourquoi de l'erreur. Je suppose qu'il va
maintenant compiler TOUS le headers modifiés avec un compilateur C++, donc
tout le projet utilisera la définition `__cplusplus', donc toutes les
définitions de la classe auront le même membre, ce qui ne me semble pas
violer l'ODR (le préprocesseur se chargera de virer la partie C).

il faut aussi qu'il s'assure qu'aucune fonction "C" définie dans une
unité de traduction compilée par un compilateur C ne fera partie du
programme C++ final. Ce qui est rarement le cas, autrement la
question ne se poserait pas. En tout, si tu prends l'exemple répandu
des en-têtes X Windows, ce n'est clairmeent pas le cas.

-- Gaby

Back to top
Michaël Monerau
Guest





PostPosted: Mon Sep 15, 2003 6:08 pm    Post subject: Re: Signature de struct Reply with quote

Gabriel Dos Reis wrote:
Quote:
"Michaël Monerau" <cort (AT) meloo (DOT) com> writes:

Si tu violes cette règle simple, alors...

Je ne comprends pas bien le pourquoi de l'erreur. Je suppose qu'il va
maintenant compiler TOUS le headers modifiés avec un compilateur
C++, donc tout le projet utilisera la définition `__cplusplus', donc
toutes les définitions de la classe auront le même membre, ce qui ne
me semble pas violer l'ODR (le préprocesseur se chargera de virer la
partie C).

il faut aussi qu'il s'assure qu'aucune fonction "C" définie dans une
unité de traduction compilée par un compilateur C ne fera partie du
programme C++ final. Ce qui est rarement le cas, autrement la
question ne se poserait pas. En tout, si tu prends l'exemple répandu
des en-têtes X Windows, ce n'est clairmeent pas le cas.

Ah, je connais pas le code X Windows. Mais je vois pas bien comment un
programme peut être le résultat d'un compilation C et C++ en même temps.
Mais je manque sûrement d'imagination et d'expérience, je te fais confiance
sur ce dernier point ;-)

Merci pour la précision.
--
<=- Michaël "Cortex" Monerau -=>



Back to top
Gabriel Dos Reis
Guest





PostPosted: Mon Sep 15, 2003 6:12 pm    Post subject: Re: Signature de struct Reply with quote

"Michaël Monerau" <cort (AT) meloo (DOT) com> writes:
Quote:
Ah, je connais pas le code X Windows.

ce n'est pas important.

Réfléchis un peu : pour quelles raisons tu voudrais partager un
en-tête entre un programme C et un programme C++ ?

-- Gaby

Back to top
Michaël Monerau
Guest





PostPosted: Mon Sep 15, 2003 6:19 pm    Post subject: Re: Signature de struct Reply with quote

Gabriel Dos Reis wrote:
Quote:
"Michaël Monerau" <cort (AT) meloo (DOT) com> writes:
Ah, je connais pas le code X Windows.

ce n'est pas important.

Réfléchis un peu : pour quelles raisons tu voudrais partager un
en-tête entre un programme C et un programme C++ ?

Moi, je ne voudras pas ;-)

Plus sérieusement, on peut le vouloir dans le cas d'une lib qui doit être
accessible pour des programmeurs à la fois C et C++... Mais alors, les
headers seront utilisés pour des programmes différents, qui auront des
instances de compilations différentes, et donc qui n'auront pas de problèmes
d'ODR.

Il y a forcément quelque chose que je n'ai pas compris...
--
<=- Michaël "Cortex" Monerau -=>



Back to top
Michaël Monerau
Guest





PostPosted: Mon Sep 15, 2003 7:03 pm    Post subject: Re: Signature de struct Reply with quote

Gabriel Dos Reis wrote:
Quote:
"Michaël Monerau" <cort (AT) meloo (DOT) com> writes:

Plus sérieusement, on peut le vouloir dans le cas d'une lib qui doit
être accessible pour des programmeurs à la fois C et C++... Mais
alors, les headers seront utilisés pour des programmes différents,
qui auront des instances de compilations différentes, et donc qui
n'auront pas de problèmes d'ODR.

sauf que les programmes devront être linkés contre la bibliothèque,
qui en générale est unique. Donc, le programme C++ au final va
comprendre des bouts compilés avec un compilateurs C (la bibliothèque)
qui aura vu une définition différente de celle du programme C++.

D'accord. Je n'avais pas pensé que l'ODR s'appliquait aussi aux libraries
contre lesquelles on linkait... Enfin, c'est logique maintenant que j'y
repense :)

Merci pour cet éclaircissement Wink
--
<=- Michaël "Cortex" Monerau -=>



Back to top
Thierry Noc
Guest





PostPosted: Mon Sep 15, 2003 8:46 pm    Post subject: Re: Signature de struct Reply with quote


"Gabriel Dos Reis" <gdr (AT) integrable-solutions (DOT) net> a écrit dans le message de
news:m3ad96rlre.fsf (AT) uniton (DOT) integrable-solutions.net...
Quote:
"Thierry Noc" <svill (AT) free (DOT) fr> writes:


C'est là où intervient l'ODR (One Definition Rule) qui dit que deux
classes sont les mêmes si et seulement si les suites de tokens en
correspondance biunivoque.

et par 'token' on entend le type du membre et le nom du membre ?
c'est a dire 'int' est un token et 'operator' aussi ?



Back to top
Thierry Noc
Guest





PostPosted: Mon Sep 15, 2003 9:23 pm    Post subject: Re: Signature de struct Reply with quote


"Loïc Joly" <loic.actarus.joly (AT) wanadoo (DOT) fr> a écrit dans le message de
news:bk53g3$o3f$1 (AT) news-reader1 (DOT) wanadoo.fr...
Quote:
Michaël Monerau wrote:

Pour le posteur initial, une version vraiment propre consisterait à
écrire une couche d'interface pour cette bibliothèque en C compatible
C++, mais ça rajoute un niveau de complexité.

C'est impensable car en fait c'est pas une lib. Je rajoute des modules C++ a
une appli en C dont j'ai pas le source. Ces modules doivent être chacun une
librairie dynamique (instancié explicitement et a la demande si besoin par
l'appli principale), et les modules font beaucoup appel a des fonctions et
des données publiques de l'appli.
L'appli utilise les modules au travers d'une structure de pointeurs de
fonction définie dans chaque module.

C'est donc un peu compliqué, et ce coup de membre genre 'operator' ne fait
qu'accroître le doute.

En plus, mes modules C++ utilisent une lib C++ dynamique commune qui
instancie un objet global (comme cerr par exemple) et je me demande si cet
objet est instancié par module ou qu'une seule fois (je pense que oui mais
j'ose même pas voir).

En fait j'y comprend tellement rien que sais même pas si ce genre de
considération (lib dynamique) relève du C++ ou de l'implémentation /
plate-forme.



Back to top
Gabriel Dos Reis
Guest





PostPosted: Mon Sep 15, 2003 9:53 pm    Post subject: Re: Signature de struct Reply with quote

drkm <darkman_spam (AT) yahoo (DOT) fr> writes:

Quote:
Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> writes:

éviter le nom « operator » est plus simple.

Yep. J'ai été étonné de voir, lors de magouilles avec le code
source de GCC, qu'il contient une telle déclaration.

le source de GCC est truffé d'abominations sans nom -- et visibelement
certains développeurs se font un point d'honneur d'écrire de telles
choses, puisque de toute façon C++ n'existe pas sur leur planète.

-- Gaby

Back to top
drkm
Guest





PostPosted: Mon Sep 15, 2003 9:54 pm    Post subject: Re: Signature de struct Reply with quote

"Thierry Noc" <svill (AT) free (DOT) fr> writes:

Quote:
"Loïc Joly" <loic.actarus.joly (AT) wanadoo (DOT) fr> a écrit dans le message de
news:bk53g3$o3f$1 (AT) news-reader1 (DOT) wanadoo.fr...

Pour le posteur initial, une version vraiment propre consisterait
à écrire une couche d'interface pour cette bibliothèque en C
compatible C++, mais ça rajoute un niveau de complexité.

C'est impensable car en fait c'est pas une lib. Je rajoute des
modules C++ a une appli en C dont j'ai pas le source.

Mais si tu définis une couche d'interface en C, qui utilise
l'implémentation existante (avec `operator') et est destinée à être
utilisée par le code C++ (et sera donc « compatible » C et C++), quel
est le problème ?

--drkm

Back to top
Gabriel Dos Reis
Guest





PostPosted: Mon Sep 15, 2003 9:56 pm    Post subject: Re: Signature de struct Reply with quote

"Thierry Noc" <svill (AT) free (DOT) fr> writes:

Quote:
"Gabriel Dos Reis" <gdr (AT) integrable-solutions (DOT) net> a écrit dans le message de
news:m3ad96rlre.fsf (AT) uniton (DOT) integrable-solutions.net...
"Thierry Noc" <svill (AT) free (DOT) fr> writes:


C'est là où intervient l'ODR (One Definition Rule) qui dit que deux
classes sont les mêmes si et seulement si les suites de tokens en
correspondance biunivoque.

et par 'token' on entend le type du membre et le nom du membre ?
c'est a dire 'int' est un token et 'operator' aussi ?

yep.

tu peux éviter le « problème » en ne redéfinissant pas la structure dans
les programes C++. Mais de l'autre côté, c'est un abus répandu qui
« marche » dans la pratique.

-- Gaby

Back to top
Thierry Noc
Guest





PostPosted: Tue Sep 16, 2003 7:43 am    Post subject: Re: Signature de struct Reply with quote


"drkm" <darkman_spam (AT) yahoo (DOT) fr> a écrit dans le message de news:
[email]wkpti1ra4c.fsf (AT) yahoo (DOT) fr[/email]...
Quote:
"Thierry Noc" <svill (AT) free (DOT) fr> writes:

"Loïc Joly" <loic.actarus.joly (AT) wanadoo (DOT) fr> a écrit dans le message de
news:bk53g3$o3f$1 (AT) news-reader1 (DOT) wanadoo.fr...

Pour le posteur initial, une version vraiment propre consisterait
à écrire une couche d'interface pour cette bibliothèque en C
compatible C++, mais ça rajoute un niveau de complexité.

C'est impensable car en fait c'est pas une lib. Je rajoute des
modules C++ a une appli en C dont j'ai pas le source.

Mais si tu définis une couche d'interface en C, qui utilise
l'implémentation existante (avec `operator') et est destinée à être
utilisée par le code C++ (et sera donc « compatible » C et C++), quel
est le problème ?

En fait tu veux dire d'écrire une interface juste pour les fonctions
utilisant la struct en argument ou en retour.
Faut penser aussi a faire une interface pour l'accès aux données globales de
l'appli qui contiennent cette struct.
Ca me paraît tellement de boulot que j'ai du mal a cerner tout ce qu'il y
aurait a faire.




Back to top
drkm
Guest





PostPosted: Tue Sep 16, 2003 9:33 am    Post subject: Re: Signature de struct Reply with quote

"Thierry Noc" <svill (AT) free (DOT) fr> writes:

Quote:
"drkm" <darkman_spam (AT) yahoo (DOT) fr> a écrit dans le message de news:
[email]wkpti1ra4c.fsf (AT) yahoo (DOT) fr[/email]...

Mais si tu définis une couche d'interface en C, qui utilise
l'implémentation existante (avec `operator') et est destinée à
être utilisée par le code C++ (et sera donc « compatible » C et
C++), quel est le problème ?

En fait tu veux dire d'écrire une interface juste pour les fonctions
utilisant la struct en argument ou en retour.

Tu ne peux pas inclure l'en-tête où est défini la structure. Il
faut donc fournir, s'il en a besoin, les fonctionalités de cet en-tête
à ton code C++. Tu crées donc un ensemble de fonctions et de types de
données qui agirons sur cette structure.

Le reste de l'application ne doit bien sûr pas être modifié, il
continue d'utiliser directement la structure. La couche d'indirection
que tu définis doit être en C, pour pouvoir utiliser la structure
incriminée, mais être également du C++ valide (sans utiliser
« operator », par exemple).

Quote:
Faut penser aussi a faire une interface pour l'accès aux données
globales de l'appli qui contiennent cette struct. Ca me paraît
tellement de boulot que j'ai du mal a cerner tout ce qu'il y aurait
a faire.

Ca dépend. Avec des interfaces modulaires, il y a moyen de ne
fournir que quelques fonctions très simples. Avec des fichiers comme
ceux de GCC, puisque l'on en parlait dans ce thread, c'est un
cauchemard.

Mais dans ce genre de situation, c'est de toutes façons trop de
boulot, dans le sens où c'est un boulot qui aurait pû nous être évité
facilement.

--drkm

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.