James Kanze writes:
[...]
| > C'est bien garanti par la norme ça ?
| Pas vraiment. Il y a deux questions ici vis-à-vis de la norme.
| -- La première, c'est que la norme donne deux alternatifs pour
| l'initialisation des statiques : ou bien, ils sont
| initialisés avant d'entrer en main, ou bien, ils sont
| initialisés avant la première utilisation de l'unité de
| compilation qui les contient.
| En fait, toutes les implémentations utilisent le permier, et
| pour deux raisons. D'abord, il y a de plus en plus de code
| qu'y compte, et qu'on ne veut pas casser, et deuxièmement,
| le deuxième alternatif n'est pas implémentable s'il y a des
| cycles (et la norme dit que si on le choisit, il faut qu'il
| marche -- sans exception pour des cycles).
| Dans la pratique, je crois qu'on peut dire que dans
| l'absence des objets linkés dynamiquement, les statiques
| sont initialisés avant l'entrée dans main.
Sauf que dans la pratique, il y a de plus en plus d'objets
dynamiquement liés.
James Kanze <kanze@none> writes:
[...]
| > C'est bien garanti par la norme ça ?
| Pas vraiment. Il y a deux questions ici vis-à-vis de la norme.
| -- La première, c'est que la norme donne deux alternatifs pour
| l'initialisation des statiques : ou bien, ils sont
| initialisés avant d'entrer en main, ou bien, ils sont
| initialisés avant la première utilisation de l'unité de
| compilation qui les contient.
| En fait, toutes les implémentations utilisent le permier, et
| pour deux raisons. D'abord, il y a de plus en plus de code
| qu'y compte, et qu'on ne veut pas casser, et deuxièmement,
| le deuxième alternatif n'est pas implémentable s'il y a des
| cycles (et la norme dit que si on le choisit, il faut qu'il
| marche -- sans exception pour des cycles).
| Dans la pratique, je crois qu'on peut dire que dans
| l'absence des objets linkés dynamiquement, les statiques
| sont initialisés avant l'entrée dans main.
Sauf que dans la pratique, il y a de plus en plus d'objets
dynamiquement liés.
James Kanze writes:
[...]
| > C'est bien garanti par la norme ça ?
| Pas vraiment. Il y a deux questions ici vis-à-vis de la norme.
| -- La première, c'est que la norme donne deux alternatifs pour
| l'initialisation des statiques : ou bien, ils sont
| initialisés avant d'entrer en main, ou bien, ils sont
| initialisés avant la première utilisation de l'unité de
| compilation qui les contient.
| En fait, toutes les implémentations utilisent le permier, et
| pour deux raisons. D'abord, il y a de plus en plus de code
| qu'y compte, et qu'on ne veut pas casser, et deuxièmement,
| le deuxième alternatif n'est pas implémentable s'il y a des
| cycles (et la norme dit que si on le choisit, il faut qu'il
| marche -- sans exception pour des cycles).
| Dans la pratique, je crois qu'on peut dire que dans
| l'absence des objets linkés dynamiquement, les statiques
| sont initialisés avant l'entrée dans main.
Sauf que dans la pratique, il y a de plus en plus d'objets
dynamiquement liés.
...
En fait, toutes les implémentations utilisent le permier, et
pour deux raisons. D'abord, il y a de plus en plus de code
qu'y compte, et qu'on ne veut pas casser, et deuxièmement,
le deuxième alternatif n'est pas implémentable s'il y a des
cycles (et la norme dit que si on le choisit, il faut qu'il
marche -- sans exception pour des cycles).
Dans la pratique, je crois qu'on peut dire que dans
l'absence des objets linkés dynamiquement, les statiques
sont initialisés avant l'entrée dans main.
-- La norme ne s'adresse pas à la question : comment invoquer
le compilateur, et donc, comment spécifier qu'une source (ou
l'objet qui en dérive) fasse partie du programme. Dans les
....
Ils ont aussi des variations sur des possibilités
supplémentaires. Mais la distinction fichier objet/fichier
bibliothèque est tellement universelle que je crois qu'on
peut y compter.
(surtout l'ordre) qu'ils traitent les différents éléments.
Ils ont aussi des variations sur des possibilités
supplémentaires. Mais la distinction fichier objet/fichier
bibliothèque est tellement universelle que je crois qu'on
peut y compter.
Donc, si ta question est : est-ce qu'il est garanti par la norme
que, donné les sources ci-dessus, les commandes :g++ -g -c -Wall libtoto.cpp
g++ -g -c -Wall main.cpp
g++ -g -Wall main.o libtoto.o -o tototest
génèreront un programme qui affiche "toto is used", la résponse
est certainement non -- ces commandes-là, elles ne feront
absolument rien avec VC++, par exemple.
D'accord, j'ai pris gcc comme exemple car c'est assez répandu :-D
Mais, et je crois que
c'est ce qui t'intéresse, tu peux compter que pour tout
compilateur C++, il y a une suite équivalente des commandes, et
que cette suite équivalente donnera bien un programme qui
affiche "toto is used".
Merci beaucoup pour toutes ces précisions.
même s'il n'y a rien dans le 'main' qui indique que l'objet
toto est utilisé ?
La question n'est pas si toto est utilisé. La question, c'est
d'abord et surtout si libtoto.cpp fait partie de ton programme.
Si libtoto.cpp fait partie du programme, l'objet qu'il contient
doit être initialisé.
J'ai bien saisi la différence fichier objet/Bibliotheque,
...
En fait, toutes les implémentations utilisent le permier, et
pour deux raisons. D'abord, il y a de plus en plus de code
qu'y compte, et qu'on ne veut pas casser, et deuxièmement,
le deuxième alternatif n'est pas implémentable s'il y a des
cycles (et la norme dit que si on le choisit, il faut qu'il
marche -- sans exception pour des cycles).
Dans la pratique, je crois qu'on peut dire que dans
l'absence des objets linkés dynamiquement, les statiques
sont initialisés avant l'entrée dans main.
-- La norme ne s'adresse pas à la question : comment invoquer
le compilateur, et donc, comment spécifier qu'une source (ou
l'objet qui en dérive) fasse partie du programme. Dans les
....
Ils ont aussi des variations sur des possibilités
supplémentaires. Mais la distinction fichier objet/fichier
bibliothèque est tellement universelle que je crois qu'on
peut y compter.
(surtout l'ordre) qu'ils traitent les différents éléments.
Ils ont aussi des variations sur des possibilités
supplémentaires. Mais la distinction fichier objet/fichier
bibliothèque est tellement universelle que je crois qu'on
peut y compter.
Donc, si ta question est : est-ce qu'il est garanti par la norme
que, donné les sources ci-dessus, les commandes :
g++ -g -c -Wall libtoto.cpp
g++ -g -c -Wall main.cpp
g++ -g -Wall main.o libtoto.o -o tototest
génèreront un programme qui affiche "toto is used", la résponse
est certainement non -- ces commandes-là, elles ne feront
absolument rien avec VC++, par exemple.
D'accord, j'ai pris gcc comme exemple car c'est assez répandu :-D
Mais, et je crois que
c'est ce qui t'intéresse, tu peux compter que pour tout
compilateur C++, il y a une suite équivalente des commandes, et
que cette suite équivalente donnera bien un programme qui
affiche "toto is used".
Merci beaucoup pour toutes ces précisions.
même s'il n'y a rien dans le 'main' qui indique que l'objet
toto est utilisé ?
La question n'est pas si toto est utilisé. La question, c'est
d'abord et surtout si libtoto.cpp fait partie de ton programme.
Si libtoto.cpp fait partie du programme, l'objet qu'il contient
doit être initialisé.
J'ai bien saisi la différence fichier objet/Bibliotheque,
...
En fait, toutes les implémentations utilisent le permier, et
pour deux raisons. D'abord, il y a de plus en plus de code
qu'y compte, et qu'on ne veut pas casser, et deuxièmement,
le deuxième alternatif n'est pas implémentable s'il y a des
cycles (et la norme dit que si on le choisit, il faut qu'il
marche -- sans exception pour des cycles).
Dans la pratique, je crois qu'on peut dire que dans
l'absence des objets linkés dynamiquement, les statiques
sont initialisés avant l'entrée dans main.
-- La norme ne s'adresse pas à la question : comment invoquer
le compilateur, et donc, comment spécifier qu'une source (ou
l'objet qui en dérive) fasse partie du programme. Dans les
....
Ils ont aussi des variations sur des possibilités
supplémentaires. Mais la distinction fichier objet/fichier
bibliothèque est tellement universelle que je crois qu'on
peut y compter.
(surtout l'ordre) qu'ils traitent les différents éléments.
Ils ont aussi des variations sur des possibilités
supplémentaires. Mais la distinction fichier objet/fichier
bibliothèque est tellement universelle que je crois qu'on
peut y compter.
Donc, si ta question est : est-ce qu'il est garanti par la norme
que, donné les sources ci-dessus, les commandes :g++ -g -c -Wall libtoto.cpp
g++ -g -c -Wall main.cpp
g++ -g -Wall main.o libtoto.o -o tototest
génèreront un programme qui affiche "toto is used", la résponse
est certainement non -- ces commandes-là, elles ne feront
absolument rien avec VC++, par exemple.
D'accord, j'ai pris gcc comme exemple car c'est assez répandu :-D
Mais, et je crois que
c'est ce qui t'intéresse, tu peux compter que pour tout
compilateur C++, il y a une suite équivalente des commandes, et
que cette suite équivalente donnera bien un programme qui
affiche "toto is used".
Merci beaucoup pour toutes ces précisions.
même s'il n'y a rien dans le 'main' qui indique que l'objet
toto est utilisé ?
La question n'est pas si toto est utilisé. La question, c'est
d'abord et surtout si libtoto.cpp fait partie de ton programme.
Si libtoto.cpp fait partie du programme, l'objet qu'il contient
doit être initialisé.
J'ai bien saisi la différence fichier objet/Bibliotheque,
Dans l'ensemble, l'édition de liens dynamique est une autre
question, qu'il faut bien prendre en compte. Ou non, selon les
exigeances de l'application. Mais je crois que tu as raison ;
j'aurais dû au moins l'évoquer. Techniquement, il ne fait pas
partie du C++, et il ne s'agit pas non plus des bibliothèques,
mais pratiquement, c'est effectivement possible que le poster
doit le prendre en compte, quel que soit sa position vis-à-vis
de la norme, et indifférement de comment on l'appelle. Même s'il
n'intervenait pas dans son exemple.
Dans l'ensemble, l'édition de liens dynamique est une autre
question, qu'il faut bien prendre en compte. Ou non, selon les
exigeances de l'application. Mais je crois que tu as raison ;
j'aurais dû au moins l'évoquer. Techniquement, il ne fait pas
partie du C++, et il ne s'agit pas non plus des bibliothèques,
mais pratiquement, c'est effectivement possible que le poster
doit le prendre en compte, quel que soit sa position vis-à-vis
de la norme, et indifférement de comment on l'appelle. Même s'il
n'intervenait pas dans son exemple.
Dans l'ensemble, l'édition de liens dynamique est une autre
question, qu'il faut bien prendre en compte. Ou non, selon les
exigeances de l'application. Mais je crois que tu as raison ;
j'aurais dû au moins l'évoquer. Techniquement, il ne fait pas
partie du C++, et il ne s'agit pas non plus des bibliothèques,
mais pratiquement, c'est effectivement possible que le poster
doit le prendre en compte, quel que soit sa position vis-à-vis
de la norme, et indifférement de comment on l'appelle. Même s'il
n'intervenait pas dans son exemple.
Je ne pensais pas que la tradition était aussi importante.
J'aurais cru que les norme étaient plus précise. C'est bon à
savoir.
C'est assez étonnant. Peut-être que la norme incorporera un
jour ces éléments. Puisque celà semble être un standard de
fait ?
Donc, si ta question est : est-ce qu'il est garanti par la
norme que, donné les sources ci-dessus, les commandes :g++ -g -c -Wall libtoto.cpp
g++ -g -c -Wall main.cpp
g++ -g -Wall main.o libtoto.o -o tototest
génèreront un programme qui affiche "toto is used", la
résponse est certainement non -- ces commandes-là, elles ne
feront absolument rien avec VC++, par exemple.
D'accord, j'ai pris gcc comme exemple car c'est assez répandu
:-D
Mais, et je crois que c'est ce qui t'intéresse, tu peux
compter que pour tout compilateur C++, il y a une suite
équivalente des commandes, et que cette suite équivalente
donnera bien un programme qui affiche "toto is used".
Merci beaucoup pour toutes ces précisions.même s'il n'y a rien dans le 'main' qui indique que
l'objet toto est utilisé ?
La question n'est pas si toto est utilisé. La question,
c'est d'abord et surtout si libtoto.cpp fait partie de ton
programme. Si libtoto.cpp fait partie du programme, l'objet
qu'il contient doit être initialisé.
J'ai bien saisi la différence fichier objet/Bibliotheque,
j'avais tendance à ne pas trop la faire avant. C'est vrai que
dans beaucoup de cas ça ne change rien au fonctionnement du
programme.
Par contre j'ai fait un programme qui utilise assez
massivement l'initialisation d'objets qui ne sont pas utilisés
dans le 'main' pour faire de choses avant l'execution du
'main' et ça m'aurait vraiment embêter d'apprendre que ça ne
marche qu'avec gcc sous linux (par exemple).
C'est parfois très pratique ce comportement.
Je ne pensais pas que la tradition était aussi importante.
J'aurais cru que les norme étaient plus précise. C'est bon à
savoir.
C'est assez étonnant. Peut-être que la norme incorporera un
jour ces éléments. Puisque celà semble être un standard de
fait ?
Donc, si ta question est : est-ce qu'il est garanti par la
norme que, donné les sources ci-dessus, les commandes :
g++ -g -c -Wall libtoto.cpp
g++ -g -c -Wall main.cpp
g++ -g -Wall main.o libtoto.o -o tototest
génèreront un programme qui affiche "toto is used", la
résponse est certainement non -- ces commandes-là, elles ne
feront absolument rien avec VC++, par exemple.
D'accord, j'ai pris gcc comme exemple car c'est assez répandu
:-D
Mais, et je crois que c'est ce qui t'intéresse, tu peux
compter que pour tout compilateur C++, il y a une suite
équivalente des commandes, et que cette suite équivalente
donnera bien un programme qui affiche "toto is used".
Merci beaucoup pour toutes ces précisions.
même s'il n'y a rien dans le 'main' qui indique que
l'objet toto est utilisé ?
La question n'est pas si toto est utilisé. La question,
c'est d'abord et surtout si libtoto.cpp fait partie de ton
programme. Si libtoto.cpp fait partie du programme, l'objet
qu'il contient doit être initialisé.
J'ai bien saisi la différence fichier objet/Bibliotheque,
j'avais tendance à ne pas trop la faire avant. C'est vrai que
dans beaucoup de cas ça ne change rien au fonctionnement du
programme.
Par contre j'ai fait un programme qui utilise assez
massivement l'initialisation d'objets qui ne sont pas utilisés
dans le 'main' pour faire de choses avant l'execution du
'main' et ça m'aurait vraiment embêter d'apprendre que ça ne
marche qu'avec gcc sous linux (par exemple).
C'est parfois très pratique ce comportement.
Je ne pensais pas que la tradition était aussi importante.
J'aurais cru que les norme étaient plus précise. C'est bon à
savoir.
C'est assez étonnant. Peut-être que la norme incorporera un
jour ces éléments. Puisque celà semble être un standard de
fait ?
Donc, si ta question est : est-ce qu'il est garanti par la
norme que, donné les sources ci-dessus, les commandes :g++ -g -c -Wall libtoto.cpp
g++ -g -c -Wall main.cpp
g++ -g -Wall main.o libtoto.o -o tototest
génèreront un programme qui affiche "toto is used", la
résponse est certainement non -- ces commandes-là, elles ne
feront absolument rien avec VC++, par exemple.
D'accord, j'ai pris gcc comme exemple car c'est assez répandu
:-D
Mais, et je crois que c'est ce qui t'intéresse, tu peux
compter que pour tout compilateur C++, il y a une suite
équivalente des commandes, et que cette suite équivalente
donnera bien un programme qui affiche "toto is used".
Merci beaucoup pour toutes ces précisions.même s'il n'y a rien dans le 'main' qui indique que
l'objet toto est utilisé ?
La question n'est pas si toto est utilisé. La question,
c'est d'abord et surtout si libtoto.cpp fait partie de ton
programme. Si libtoto.cpp fait partie du programme, l'objet
qu'il contient doit être initialisé.
J'ai bien saisi la différence fichier objet/Bibliotheque,
j'avais tendance à ne pas trop la faire avant. C'est vrai que
dans beaucoup de cas ça ne change rien au fonctionnement du
programme.
Par contre j'ai fait un programme qui utilise assez
massivement l'initialisation d'objets qui ne sont pas utilisés
dans le 'main' pour faire de choses avant l'execution du
'main' et ça m'aurait vraiment embêter d'apprendre que ça ne
marche qu'avec gcc sous linux (par exemple).
C'est parfois très pratique ce comportement.