OVH Cloud OVH Cloud

char const *foo vs const char *foo

33 réponses
Avatar
xylo
Tout est dans le sujet.

J'ai un doute... !? y a-t-il réellement une différence et si oui quel est
l'impacte sur le code ?

--
Apply rot13 to this e-mail address before using it.
JM Marino
http://jm.marino.free.fr

10 réponses

1 2 3 4
Avatar
Antoine Leca
Le 04/06/2009 8:23, Pierre Maurette écrivit :
"foo est concerné par le qualifieur (hum) de type const"



qualificatif ?


Antoine
Avatar
Antoine Leca
Le 04/06/2009 12:36, candide écrivit :
Pierre Maurette a écrit :
Effectivement, j'aurais dû écrire "foo est concerné par le qualifieur
(hum) de type const"



Qu'est-ce que c'est que ce charabia ? "foo est concerné" non mais ! et pourquoi
pas aussi "foo est interpelé" ou "foo a une âme" ?

"de type const" : vraiment n'importe quoi, const n'est pas un type.



Effectivement : en l'occurence, «de type» est un complément de
l'adjectif substantivé «qualifieur» (je préfère qualificatif), tandis
que const est son nom. Donc const est un «qualifieur».

En anglais, l'expression est "the type qualifier /const/".


Antoine
Avatar
Pierre Maurette
Antoine Leca, le 04/06/2009 a écrit :
Le 04/06/2009 8:23, Pierre Maurette écrivit :
"foo est concerné par le qualifieur (hum) de type const"



qualificatif ?



Oui, sans doute.
En fait, ce que je vois derrière const et volatile (et restrict), c'est
une idée de surcharge. En gros, un /int const/ est un /int/. Alors
qu'un /int*/ ou un /int[2]/ (ou même un /int[1]/) ne sont pas du tout
des /int/.

--
Pierre Maurette
Avatar
candide
Antoine Leca a écrit :
Le 04/06/2009 8:23, Pierre Maurette écrivit :
"foo est concerné par le qualifieur (hum) de type const"



qualificatif ?




Finalement, ça me parait être la meilleure traduction.

identifier -> identificateur,
type specifier -> spécificateur de type
donc
type qualifier -> "qualificateur" de type

"qualificateur" n'existe pas, "qualifieur" non plus donc "qualificatif" me
paraît bon.

Dans la littérature du C en langue française et jargonneuse :

Delannoy : qualifieur
Garetta : qualifieur
Braquelaire : qualificatif

Braquelaire est presque imbattable en jargonneries. Comment appelle-t-il
auto, extern, register et static ? Réponse : des spécifications de rangement !
Comment désigne-t-il "typedef" ? Réponse : un constructeur !

Tiens en lisant ce qu'écrit Braquelaire sur const je retrouve le vocabulaire et
les formulations regrettables utilisées dans ce fil :

"Le qualificatif de type const placé devant une déclaration etc" (page 103)

"Pour définir une constante pointeur, on place le qualificatif const juste après
l'opérateur de déclaration *" (page 103). Au passage, bof-bof pour "l'opérateur
de déclaration *".


Bon, il se reprend quand même pour préciser :

"Il est important de noter que les objets déclarés au moyen du qualificatif
const ne sont pas réellement des constantes, etc"


Tiens, il parle lui aussi de "constantes littérales" y compris pour des
constantes entières ou flottantes.
Avatar
xylo
Le Fri, 05 Jun 2009 01:05:47 +0200, candide a écrit:

Antoine Leca a écrit :
Le 04/06/2009 8:23, Pierre Maurette écrivit :
"foo est concerné par le qualifieur (hum) de type const"



qualificatif ?




Finalement, ça me parait être la meilleure traduction.

identifier -> identificateur,
type specifier -> spécificateur de type
donc
type qualifier -> "qualificateur" de type

"qualificateur" n'existe pas, "qualifieur" non plus donc "qualificatif" me
paraît bon.

Dans la littérature du C en langue française et jargonneuse :

Delannoy : qualifieur
Garetta : qualifieur
Braquelaire : qualificatif

Braquelaire est presque imbattable en jargonneries. Comment appelle-t-il
auto, extern, register et static ? Réponse : des spécifications de rangement !
Comment désigne-t-il "typedef" ? Réponse : un constructeur !

Tiens en lisant ce qu'écrit Braquelaire sur const je retrouve le vocabulaire et
les formulations regrettables utilisées dans ce fil :

"Le qualificatif de type const placé devant une déclaration etc" (page 103)

"Pour définir une constante pointeur, on place le qualificatif const juste après
l'opérateur de déclaration *" (page 103). Au passage, bof-bof pour "l'opérateur
de déclaration *".


Bon, il se reprend quand même pour préciser :

"Il est important de noter que les objets déclarés au moyen du qualificatif
const ne sont pas réellement des constantes, etc"


Tiens, il parle lui aussi de "constantes littérales" y compris pour des
constantes entières ou flottantes.



1) Est-ce que je peux considérer que la réponse SIMPLE est:

const <type> <variable> == <type> const <variable>

OUI ou NON
Les autres comentaires sont certainement assez jouissifs pour ceux qui les
postent mais ils sont hors sujet... désolé.

--
Apply rot13 to this e-mail address before using it.
JM Marino
http://jm.marino.free.fr
Avatar
Pierre Maurette
xylo, le 05/06/2009 a écrit :

[...]

1) Est-ce que je peux considérer que la réponse SIMPLE est:

const <type> <variable> == <type> const <variable>

OUI ou NON
Les autres comentaires sont certainement assez jouissifs pour ceux qui les
postent mais ils sont hors sujet... désolé.



OUI (déjà dit)

--
Pierre Maurette
Avatar
-ed-
On 5 juin, 07:17, xylo wrote:

1) Est-ce que je peux considérer que la réponse SIMPLE est:

const <type> <variable> == <type> const <variable>

OUI ou NON



Oui, comme il a été expliqué plusieurs fois... Mais il est vrai que
certains s'amusent à brouiller le message.
Avatar
Hamiral
-ed- a écrit :
On 5 juin, 07:17, xylo wrote:

1) Est-ce que je peux considérer que la réponse SIMPLE est:

const <type> <variable> == <type> const <variable>

OUI ou NON



Oui, comme il a été expliqué plusieurs fois... Mais il est vrai q ue
certains s'amusent à brouiller le message.



Et le message est tellement habilement brouillé, qu'à chaque fois que la
question "const" revient sur le tapis, je relis les threads en entier,
et au final je ne sais toujours pas comment utiliser const !

Un peu triste comme constat, non ?

Maintenant si une bonne âme pouvait donner une explication claire,
compréhensible pour tous même ceux qui ne savent pas lire la norme, c e
serait super...

(effectivement je n'ai pas lu la FAQ avant de poster ce message mais je
l'aurai fait après).

Ham
Avatar
Hamiral
Hamiral a écrit :
(effectivement je n'ai pas lu la FAQ avant de poster ce message mais je
l'aurai fait après).

Ham



Et, même après avoir lu la FAQ j'ai toujours un peu de mal... :(

Ham
Avatar
Manuel Pégourié-Gonnard
Hamiral scripsit:

Hamiral a écrit :
(effectivement je n'ai pas lu la FAQ avant de poster ce message mais je
l'aurai fait après).



Et, même après avoir lu la FAQ j'ai toujours un peu de mal... :(



Je me risque à essayer de compléter l'exemple de la FAQ avec une liste de
choses qu'on peut faire et qu'on ne peut pas faire Il n'y a pas de
différence entre sz1 et sz2 (c'était l'objet initial de ce fil).

#include <stdlib.h>

int main(void) {
/* Déclarations et initialisations */
// pointeurs non constant sur objet constant
const char * sz1 = "foubarre";
char const * sz2 = "foubarre";
// pointeur constant sur objet non constant
char * const sz3 = "foubarre";
// pointeur constant sur objet constant
char const * const sz4 = "foubarre";

/* Ce qu'on peut faire */
sz1 = sz2;
sz3[0] = 'B';

/* Ce qu'on ne peut pas faire */
// sz1[0] = 'B';
// sz3 = sz2;
// sz4 = sz2;
// sz4[0] = 'B';

return 0;
}

Les quatres instructions commentées sont illégales.

--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
1 2 3 4