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

initialisation et double déclaration de données static d'un objet non instancié

119 réponses
Avatar
heinquoi
Bjr,
j'ai un pb de compréhension sur ce code:

class Main
{
public:
static HINSTANCE hInstance;
static HINSTANCE hPrevInstance;
static int nCmdShow;
static int MessageLoop( void );
};

HINSTANCE Main::hInstance = 0; // ici, je devrais avoir une
erreur
HINSTANCE Main::hPrevInstance = 0; // ici, aussi

il y a une double déclaration non ?
Si quelqu'un peut m'éclairer ? Et l'objet n'est meme pas initialisé.
Cordialement
Heinquoi

10 réponses

Avatar
Alain Naigeon
"James Kanze" a écrit dans le message news:

drkm writes:

|> James Kanze writes:

|> > Quelque petits détails : d'abord, la tradition veut que le mot clé
|> > const précède tout ce qui concerne le type.
|> ^^^^^

|> Sans doute voulais-tu dire "static" ? Je vois mal sinon comment
|> respecter cette tradition.

Tout à fait.

J'ai hésité à parler de « storage class », parce que je
ne suis pas sur qu'un débuttant (qui se débat avec static) se
trouve à l'aise avec l'expression, mais la tradition veut que les
« storage class » (« static », « extern », « auto », « register »,
et en C, « typedef ») viennent en première position.


A tout hasard : est-ce que "deprecated" en une autre position
que la première, ce ne serait pas parce que cela facilite la
compilation ?

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

Avatar
Gabriel Dos Reis
"Alain Naigeon" writes:

| "James Kanze" a écrit dans le message news:
|
| > drkm writes:
| >
| > |> James Kanze writes:
| >
| > |> > Quelque petits détails : d'abord, la tradition veut que le mot clé
| > |> > const précède tout ce qui concerne le type.
| > |> ^^^^^
| >
| > |> Sans doute voulais-tu dire "static" ? Je vois mal sinon comment
| > |> respecter cette tradition.
| >
| > Tout à fait.
| >
| > J'ai hésité à parler de « storage class », parce que je
| > ne suis pas sur qu'un débuttant (qui se débat avec static) se
| > trouve à l'aise avec l'expression, mais la tradition veut que les
| > « storage class » (« static », « extern », « auto », « register »,
| > et en C, « typedef ») viennent en première position.
|
| A tout hasard : est-ce que "deprecated" en une autre position
| que la première, ce ne serait pas parce que cela facilite la
| compilation ?

Comment ? Le compilateur doit toujours le supporter.

-- Gaby
Avatar
Gabriel Dos Reis
drkm writes:

| Personnellement je trouve cela beaucoup plus clair, mais je ne
| connais pas l'intention. En fait, je viens de chercher, et je n'ai
| pas trouvé que cet usage était déprécié, ni dans 7.1, ni dans l'annexe

Il ne l'est pas. Il faudrait de bons/sérieux arguments pour dévier de
C++ARM, C classqieu, C90, C95.

-- Gaby
Avatar
Gabriel Dos Reis
"Alain Naigeon" writes:

| "James Kanze" a écrit dans le message news:
|
| > drkm writes:
| >
| > |> James Kanze writes:
| >
| > |> > drkm writes:
| >
| > |> [...]
| >
| > |> > |> Tiens. J'ai toujours trouvé, de manière intuitive, que
| > |> > |> ces deux concepts étaient fortement apparentés. En fait,
| > |> > |> je n'y ai jamais vu qu'un unique concept : faire du membre
| > |> > |> déclaré un membre de classe.
| >
| > |> > Vue que tout ce qu'on déclare à l'intérieur d'une classe
| > |> > est membre de la classe, je ne comprends pas la signification de
| > |> > ta phrase par rapport à static.
| >
| > |> J'employais « membre de classe » par opposition à « membre
| > |> d'instance ».
| >
| > Le problème, c'est que le C++ ne connaît pas le concepte « membre
| > d'instance ». En C++, un membre d'une classe peut être soit
| > statique, soit non-statique, c'est tout.
|
| Le problème, c'est qu'en principe une explication ne doit pas être
| circulaire ; or "statique" ne veut rien dire (immobile ??) d'autre que
| le sens que lui donne... C++. Alors on est bien avancé ;-)
| Dire que C++ ne connaît pas classe et instance, c'est peut-être vrai
| au niveau du vocabulaire, mais enfin "new" fait bien quelque chose,
| il me semble. Est-ce coupable de mettre un peu de concepts derrière
| tout ça ?

Je crois que celui qui a inventéle langage a toujours « conceptualisé »
les choses... :-)

| Et s'il faut les chercher ailleurs, est-ce vraiment un compliment
| à l'égard de C++ ?

Cela me semblerait une généralisation un peu hâtive.

-- Gaby
Avatar
drkm
"Alain Naigeon" writes:

"James Kanze" a écrit dans le message news:



[...]

J'ai hésité à parler de « storage class », parce que je
ne suis pas sur qu'un débuttant (qui se débat avec static) se
trouve à l'aise avec l'expression, mais la tradition veut que les
« storage class » (« static », « extern », « auto », « register »,
et en C, « typedef ») viennent en première position.


A tout hasard : est-ce que "deprecated" en une autre position
que la première, ce ne serait pas parce que cela facilite la
compilation ?


Je n'en sais rien, mais quelque chose de seulement dépréciée ne
facilitera jamais la compilation. Quant à interdire tout bonnement
cet usage, cela me semble casser avec beaucoup d'existant, ce qui, je
crois, a toujours été un grand frein au sein du comité.

Personnellement je trouve cela beaucoup plus clair, mais je ne
connais pas l'intention. En fait, je viens de chercher, et je n'ai
pas trouvé que cet usage était déprécié, ni dans 7.1, ni dans l'annexe
D. Je n'ai rien trouvé non plus sur le site du comité (j'ai survolé).
Où cela est-il dit ?

--drkm


Avatar
Alain Naigeon
"Gabriel Dos Reis" a écrit dans le message
news:
"Alain Naigeon" writes:

| "James Kanze" a écrit dans le message news:
|
| > drkm writes:
| >
| > |> James Kanze writes:
| >
| > |> > Quelque petits détails : d'abord, la tradition veut que le mot
clé

| > |> > const précède tout ce qui concerne le type.
| > |> ^^^^^
| >
| > |> Sans doute voulais-tu dire "static" ? Je vois mal sinon comment
| > |> respecter cette tradition.
| >
| > Tout à fait.
| >
| > J'ai hésité à parler de « storage class », parce que je
| > ne suis pas sur qu'un débuttant (qui se débat avec static) se
| > trouve à l'aise avec l'expression, mais la tradition veut que les
| > « storage class » (« static », « extern », « auto », « register »,
| > et en C, « typedef ») viennent en première position.
|
| A tout hasard : est-ce que "deprecated" en une autre position
| que la première, ce ne serait pas parce que cela facilite la
| compilation ?

Comment ? Le compilateur doit toujours le supporter.

-- Gaby


Ok, bien sûr, mais je pensais que la position en tête pouvait
faciliter les choses.
Dans ce cas, pourquoi est-ce mauvais ? Que représente
exactement "tradition" dans le message de James un peu
plus haut, juste la préférence de quelques personnes ?
Ce sont des experts, mais une préférence d'expert non
argumentée, ça n'est plus celle d'un expert ;-)
(car expert n'est pas gourou)

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

Avatar
kanze
"Alain Naigeon" wrote in message
news:<409ea01a$0$21078$...
"James Kanze" a écrit dans le message news:

drkm writes:

|> James Kanze writes:

|> > drkm writes:

|> [...]

|> > |> Tiens. J'ai toujours trouvé, de manière intuitive, que
|> > |> ces deux concepts étaient fortement apparentés. En fait,
|> > |> je n'y ai jamais vu qu'un unique concept : faire du membre
|> > |> déclaré un membre de classe.

|> > Vue que tout ce qu'on déclare à l'intérieur d'une classe est
|> > membre de la classe, je ne comprends pas la signification de
|> > ta phrase par rapport à static.

|> J'employais « membre de classe » par opposition à « membre
|> d'instance ».

Le problème, c'est que le C++ ne connaît pas le concepte « membre
d'instance ». En C++, un membre d'une classe peut être soit
statique, soit non-statique, c'est tout.


Le problème, c'est qu'en principe une explication ne doit pas être
circulaire ; or "statique" ne veut rien dire (immobile ??) d'autre que
le sens que lui donne... C++.


Tout à fait. C'est peut-être précisement parce que le mot en soi a si
peu de signification qu'il a été choisi pour autant de surcharges.

Alors on est bien avancé ;-)


Dans la doute, il faut régarder la norme, ou d'autres textes de
référence.

Dire que C++ ne connaît pas classe et instance, c'est peut-être vrai
au niveau du vocabulaire, mais enfin "new" fait bien quelque chose,


Disons que C++ ne connaît pas la notion de classe ni la notion
d'instance, c'est faux. Mais il n'en connaît pas l'opposition, comme
c'est le cas dans d'autres langages. En particulier, en C++, on parle de
membres d'une classe, qu'il s'agit des membres statiques ou non, et on
ne parle jamais de membres d'une instance (même si on parle bien parfois
d'une instance d'une classe, ou instantier une classe).

Je ne sais pas le pourquoi derrière ce choix de vocabulaire, mais c'est
comme ça, et ça ne me dérange pas outrement. Peut-être ça serait
différent si je venais d'un autre langage orienté objet.

il me semble. Est-ce coupable de mettre un peu de concepts derrière
tout ça ? Et s'il faut les chercher ailleurs, est-ce vraiment un
compliment à l'égard de C++ ?


Je ne sais pas. Je n'ai pas de problème avec la façon que C++ traite ce
problème. Je crois que je n'aurais pas de problème non plus s'il avait
choisi de parler des membres de la classe et des membres d'une instance.
Il y a beaucoup de façons à s'exprimer, et il n'y a pas forcement une
qui est meilleur que les autres.

En l'occurance, en revanche, les auteurs de C++ ont choisi à utiliser le
mot statique, y compris dans les descriptions, et ne pas parler des
membres d'une instance. Quand on parle de C++, donc, c'est le
vocabulaire auquel on s'attend. Si on dit quelque chose comme « le mot
clé statique signifie que la variable ou la fonction est membre de la
classe, et non membre de l'instance », on comprend tout de suite ; le
concepte de membre de l'instance est étranger à C++, et sa présence
signale l'utilisation d'un autre vocabulaire. Sans l'expression « membre
de l'instance », en revanche, je suppose automatiquement que « membre de
la classe » sert comme il sert d'habitude en C++.

Et évidemment, dans un cas comme dans l'autre, il faut s'expliquer plus
en détail ce que ça veut dire concrètement.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
kanze
drkm wrote in message
news:...
"Alain Naigeon" writes:

"James Kanze" a écrit dans le message news:



[...]

J'ai hésité à parler de « storage class », parce que je ne suis
pas sur qu'un débuttant (qui se débat avec static) se trouve à
l'aise avec l'expression, mais la tradition veut que les « storage
class » (« static », « extern », « auto », « register », et en C,
« typedef ») viennent en première position.


A tout hasard : est-ce que "deprecated" en une autre position que la
première, ce ne serait pas parce que cela facilite la compilation ?


Je n'en sais rien, mais quelque chose de seulement dépréciée ne
facilitera jamais la compilation. Quant à interdire tout bonnement cet
usage, cela me semble casser avec beaucoup d'existant, ce qui, je
crois, a toujours été un grand frein au sein du comité.


Je crois que c'était l'avis du comité (on parle ici du C) que de tel
code n'était pas si fréquent, et qu'il était digne d'être cassé. :-)

En fait, je ne sais pas. Il me semble assez certain que la plupart des
experts, sinon tous, ont toujours mis le « storage class » en tête.

Personnellement je trouve cela beaucoup plus clair, mais je ne
connais pas l'intention. En fait, je viens de chercher, et je n'ai pas
trouvé que cet usage était déprécié, ni dans 7.1, ni dans l'annexe D.
Je n'ai rien trouvé non plus sur le site du comité (j'ai survolé). Où
cela est-il dit ?


J'ai bien dit :

En revanche, le comité C a, je crois, dit que le droit de mettre le
static autre part qu'au début est « deprecated » ; c'est donc que
c'est officiellement considéré mauvais style.

C'est donc dans la norme C qu'il faut chercher : §6.11.5 « The placement
of a storage-class specifier other than at the beginning of the
declaration specifiers in a declaration is an obsolescent feature. »

Quand à l'autre déprécation dont j'ai parlé, l'utilisation de « static »
au portée de namespace, comme j'ai dit : « c'est ` deprecated ', ou au
moins mal vu des experts ». Je n'étais pas sûr de la position officielle
du comité, mais j'avais beaucoup entendu dire que c'est pas du C++
moderne à le faire. Mais enfin, §D.2 : « The use of the static keyword
is deprecated when declaring objects in namespace scope. »

Et maintenant, si le poster original n'est pas complètement perdu, c´est
un miracle:-).

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
kanze
drkm wrote in message
news:...
Fabien LE LEZ writes:

Exemple :

// .h

class Main
{
static size t const TAILLE TABLEAU= 12;
unsigned tableau [TAILLE TABLEAU];
};

// .cpp

size t const Main::TAILLE TABLEAU;


Est-on obligé dans ce cas, celui d'une constante entière initialisée
dans un en-tête, de la définire par ailleurs ?


Oui. Ce n'est toujours qu'une declaration, et il faut donc une
définition.

En revanche, si tu n'en prends pas l'adresse, c'est possible que le
compilateur/éditeur de liens ne remarque pas l'absence de la définition,
et que le code marche quand même.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
kanze
"Alain Naigeon" wrote in message
news:<409ea014$0$21078$...
"James Kanze" a écrit dans le message news:

drkm writes:

|> "Alain Naigeon" writes:

|> > Mais je ne comprends pas ce que tu ne
|> > comprends pas ici :-o

|> Je pense qu'il a mal compris ma formulation, et l'a prise dans le
|> sens « fonction membre » ou « variable membre ».

Tout à fait. Le concepte de membre de classe par rapport au membre
d'instance ne fait pas partie de C++. On ne parle que des « membres
de classes », y compris pour ce que dans d'autres langages, on
appelle « membres d'instance ». Et dans l'absence de l'expression
« membres d'instance », j'imaginais la signification C++, et non
la signification qu'il a voulu (qui est très courante dans d'autres
langages orientés objet).


Quand on parle *de* C++, on ne parle pas *en* C++ - comment
alors veux-tu conceptualiser la différence fondamentale entre les
deux cas ?


Quand on parle de C++, on utilise un vocabulaire propre, de même que
quand on parle de n'importe quel autre langage. Donc, quand je parle de
C++, je parle des fonctions (membre ou non), tandis que quand je parle
de Java, je parle des méthodes (qui peuvent aussi être statiques).

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34