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

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
Pierre Maurette
xylo, le 03/06/2009 a écrit :
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 ?



char const *foo ...
et
const char *foo ...

c'est la même chose. foo est un pointeur vers une (zone) constante.

En revanche, dans
char * const foo ...

foo est une constante.

Donc dans
char const * const foo
ou
const char * const foo

foo est une constante qui pointe vers une (zone) constante.

--
Pierre Maurette
Avatar
candide
Pierre Maurette a écrit :

Donc dans
char const * const foo
ou
const char * const foo

foo est une constante qui pointe vers une (zone) constante.




Le purisme n'est pas là où tu crois :

foo est une _constante_ ? tu sais ce que c'est qu'une "constante" en C ?
Avatar
xylo
Le Thu, 04 Jun 2009 00:51:49 +0200, candide a écrit:

Pierre Maurette a écrit :

Donc dans
char const * const foo
ou
const char * const foo

foo est une constante qui pointe vers une (zone) constante.




Le purisme n'est pas là où tu crois :

foo est une _constante_ ? tu sais ce que c'est qu'une "constante" en C ?



ben oui, j'étais persuadé qu'il n'existait pas vraiment de notion de
contante en C mais plus tot une notion de lecture seule d'une variable
(donc d'un espace mémoire) ??

--
Apply rot13 to this e-mail address before using it.
JM Marino
http://jm.marino.free.fr
Avatar
Marc Boyer
On 2009-06-04, xylo wrote:
Le Thu, 04 Jun 2009 00:51:49 +0200, candide a écrit:

Pierre Maurette a écrit :

Donc dans
char const * const foo
ou
const char * const foo

foo est une constante qui pointe vers une (zone) constante.




Le purisme n'est pas là où tu crois :

foo est une _constante_ ? tu sais ce que c'est qu'une "constante" en C ?



ben oui, j'étais persuadé qu'il n'existait pas vraiment de notion de
contante en C mais plus tot une notion de lecture seule d'une variable
(donc d'un espace mémoire) ??



D'ou mon exemple qui a l'avantage de marquer les étudiants:
#include <stdlib.h>
void foo(void){
const int foo = rand();
}

Marc Boyer
--
Au XXIème siècle, notre projet de société s'est réduit
à un projet économique...
Avatar
Pierre Maurette
xylo, le 04/06/2009 a écrit :
Le Thu, 04 Jun 2009 00:51:49 +0200, candide a écrit:

Pierre Maurette a écrit :

Donc dans
char const * const foo
ou
const char * const foo

foo est une constante qui pointe vers une (zone) constante.




Le purisme n'est pas là où tu crois :

foo est une _constante_ ? tu sais ce que c'est qu'une "constante" en C ?



ben oui, j'étais persuadé qu'il n'existait pas vraiment de notion de
contante en C mais plus tot une notion de lecture seule d'une variable
(donc d'un espace mémoire) ??



Effectivement, j'aurais dû écrire "foo est concerné par le qualifieur
(hum) de type const" ou plus simplement "foo est constant".
Notez quand même que si vous dites - ou écrivez - que var est une
constante float, tout le monde comprendra qu'il s'agit d'une variable
float type-qualified par const. Dans la norme, une constante (a
constant) est une constante littérale, par exemple 2.0f dans:
float const x = 2.0f;
Ne vous laissez pas embrouiller par l'aigri de service, ses varices
anales ont leur origine dans d'autres fils, à moins que ce ne soit plus
profond.

--
Pierre Maurette
Avatar
xylo
Le Thu, 04 Jun 2009 10:23:50 +0200, Pierre Maurette a écrit:

xylo, le 04/06/2009 a écrit :
Le Thu, 04 Jun 2009 00:51:49 +0200, candide a écrit:

Pierre Maurette a écrit :

Donc dans
char const * const foo
ou
const char * const foo

foo est une constante qui pointe vers une (zone) constante.




Le purisme n'est pas là où tu crois :

foo est une _constante_ ? tu sais ce que c'est qu'une "constante" en C ?



ben oui, j'étais persuadé qu'il n'existait pas vraiment de notion de
contante en C mais plus tot une notion de lecture seule d'une variable
(donc d'un espace mémoire) ??



Effectivement, j'aurais dû écrire "foo est concerné par le qualifieur
(hum) de type const" ou plus simplement "foo est constant".
Notez quand même que si vous dites - ou écrivez - que var est une
constante float, tout le monde comprendra qu'il s'agit d'une variable
float type-qualified par const. Dans la norme, une constante (a
constant) est une constante littérale, par exemple 2.0f dans:
float const x = 2.0f;
Ne vous laissez pas embrouiller par l'aigri de service, ses varices
anales ont leur origine dans d'autres fils, à moins que ce ne soit plus
profond.




CODE
****

#include <stdlib.h> /* pour calloc() */
#include <stdio.h> /* pour strncpy() */
//#include <string.h>

#define MAXSTRLEN 255

typedef enum ERR_TYPE {
noErr = 0,
memErr,

} ERR_TYPE;

int main(int argc, char **argv) {
ERR_TYPE err = noErr;

const char *pconstchar = NULL;
char const *pcharconst = NULL;

pconstchar = (const char *)calloc(MAXSTRLEN+1, sizeof(char));
if(NULL == pconstchar) { err = memErr; goto DONE;}

pcharconst = (char const *)calloc(MAXSTRLEN+1, sizeof(char));
if(NULL == pcharconst) { err = memErr; goto DONE;}

strncpy( pconstchar, "const char *pconstchar", MAXSTRLEN);
strncpy( pcharconst, "char const *pcharconst", MAXSTRLEN);

fprintf( stdout, "npconstchar: %s", pconstchar);
fprintf( stdout, "npcharconst: %s", pcharconst);

fprintf( stdout, "n");
fflush( stdout);


DONE:
free(pconstchar);
free(pcharconst);
return (noErr == err) ? EXIT_SUCCESS : EXIT_FAILURE;
}

COMPILATION
***********

gcc -c main.c -o main.o
main.c: In function 'main':
main.c:26: warning: incompatible implicit declaration of built-in function 'strncpy'
main.c:26: warning: passing argument 1 of 'strncpy' discards qualifiers from pointer target type
main.c:27: warning: passing argument 1 of 'strncpy' discards qualifiers from pointer target type
main.c:37: warning: passing argument 1 of 'free' discards qualifiers from pointer target type
main.c:38: warning: passing argument 1 of 'free' discards qualifiers from pointer target type
gcc main.o -o test

QUESTION
********

Le compilo ne semble pas faire la différence si ce n'est qu'il émet
un warning sur les deux formes ?!

--
Apply rot13 to this e-mail address before using it.
JM Marino
http://jm.marino.free.fr
Avatar
Pierre Maurette
xylo, le 04/06/2009 a écrit :
Le Thu, 04 Jun 2009 10:23:50 +0200, Pierre Maurette a écrit:

xylo, le 04/06/2009 a écrit :
Le Thu, 04 Jun 2009 00:51:49 +0200, candide a écrit:

Pierre Maurette a écrit :

Donc dans
char const * const foo
ou
const char * const foo

foo est une constante qui pointe vers une (zone) constante.




Le purisme n'est pas là où tu crois :

foo est une _constante_ ? tu sais ce que c'est qu'une "constante" en C ?



ben oui, j'étais persuadé qu'il n'existait pas vraiment de notion de
contante en C mais plus tot une notion de lecture seule d'une variable
(donc d'un espace mémoire) ??



Effectivement, j'aurais dû écrire "foo est concerné par le qualifieur
(hum) de type const" ou plus simplement "foo est constant".
Notez quand même que si vous dites - ou écrivez - que var est une
constante float, tout le monde comprendra qu'il s'agit d'une variable
float type-qualified par const. Dans la norme, une constante (a
constant) est une constante littérale, par exemple 2.0f dans:
float const x = 2.0f;
Ne vous laissez pas embrouiller par l'aigri de service, ses varices
anales ont leur origine dans d'autres fils, à moins que ce ne soit plus
profond.




CODE
****

#include <stdlib.h> /* pour calloc() */
#include <stdio.h> /* pour strncpy() */
//#include <string.h>



Pourquoi en commentaire ? C'est pourtant nécessaire et à la source
d'une paire de warnings.

#define MAXSTRLEN 255

typedef enum ERR_TYPE {
noErr = 0,
memErr,

} ERR_TYPE;

int main(int argc, char **argv) {
ERR_TYPE err = noErr;

const char *pconstchar = NULL;
char const *pcharconst = NULL;

pconstchar = (const char *)calloc(MAXSTRLEN+1, sizeof(char));



Ne pas caster le retour de ?alloc(). Pourquoi calloc() et non pas
malloc() ?

if(NULL == pconstchar) { err = memErr; goto DONE;}

pcharconst = (char const *)calloc(MAXSTRLEN+1, sizeof(char));
if(NULL == pcharconst) { err = memErr; goto DONE;}

strncpy( pconstchar, "const char *pconstchar", MAXSTRLEN);
strncpy( pcharconst, "char const *pcharconst", MAXSTRLEN);

fprintf( stdout, "npconstchar: %s", pconstchar);
fprintf( stdout, "npcharconst: %s", pcharconst);

fprintf( stdout, "n");
fflush( stdout);


DONE:
free(pconstchar);
free(pcharconst);
return (noErr == err) ? EXIT_SUCCESS : EXIT_FAILURE;
}

COMPILATION
***********

gcc -c main.c -o main.o
main.c: In function 'main':
main.c:26: warning: incompatible implicit declaration of built-in function
'strncpy' main.c:26: warning: passing argument 1 of 'strncpy' discards
qualifiers from pointer target type main.c:27: warning: passing argument 1 of
'strncpy' discards qualifiers from pointer target type main.c:37: warning:
passing argument 1 of 'free' discards qualifiers from pointer target type
main.c:38: warning: passing argument 1 of 'free' discards qualifiers from
pointer target type gcc main.o -o test

QUESTION
********

Le compilo ne semble pas faire la différence si ce n'est qu'il émet
un warning sur les deux formes ?!



Tout ça est normal. Comme écrit dans un autre message, pconstchar et
pcharconst sont tous deux des pointeurs vers une zone non modifiable.
Regardez maintenant les prototypes des fonctions free() et strncpy(),
les warnings sont normaux.
De plus, ces pointeurs pointent vers une zone allouée, qui sera remplie
par copie d'une constante chaîne de caractère. Ils ne doivent donc pas
être constant, enfin, pointer vers une zone non modifiable. Ajoutez
pconstchar[0] = 0;
juste après l'allocation, vous aurez une erreur...

--
Pierre Maurette
Avatar
candide
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.


ou plus simplement "foo est constant".



Ne veut rien dire ou tout dire. Avec toi effectivement, va pas en falloir
beaucoup pour être puriste.


Notez quand même que si vous dites - ou écrivez - que var est une



"vous dites - ou écrivez -" ou l'art des précisions inutiles.



constante float, tout le monde comprendra qu'il s'agit d'une variable
float type-qualified par const.



Absolument pas. Tu es sauvé par le var (-> variable) mais fais donc une petite
recherche sur ce forum pour savoir dans quelles circonstances on emploie le
_substantif_ (et pas l'adjectif) "constante" et tu verras qu'essentiellement on
se réfère à la notion de token "constante" ou à une expression constante et pas
du tout à une variable qualifiée const.

La façon correcte de dire est "foo est un pointeur constant", cf. par exemple la
Norme qui utilise l'expression "constant pointer to a variable value".


Dans la norme, une constante (a
constant) est une constante littérale, par exemple 2.0f dans:
float const x = 2.0f;



Constante _littérale_ ? non. "literal" dans la Norme accompagne uniquement le
terme "string".

En plus, ton exemple est vraiment mal choisi, tu laisses penser au PO que
justement une "variable constante" ne peut recevoir qu'une constante alors que
ce n'est pas du tout le cas, cf. l'exemple donné par Marc.

Ce que j'adore, c'est que dans ton livre, toutes les deux pages, on lit le mot
"pédagogie". La pédagogie, plus on en parle moins on en voit.


Ne vous laissez pas embrouiller par l'aigri de service, ses varices
anales



N'aggrave pas ton cas.
Avatar
Pierre Maurette
candide, le 04/06/2009 a écrit :
Pierre Maurette a écrit :



[...]

Ne vous laissez pas embrouiller par l'aigri de service, ses varices
anales



N'aggrave pas ton cas.



Toujours bobo au cucu ?

--
Pierre Maurette
Avatar
candide
Pierre Maurette a écrit :
candide, le 04/06/2009 a écrit :
Pierre Maurette a écrit :



[...]

Ne vous laissez pas embrouiller par l'aigri de service, ses varices
anales



N'aggrave pas ton cas.



Toujours bobo au cucu ?




T'es maso ou quoi ? T'as pas eu ta dose ? À défaut de tenir son pédagogue de
service, fclc tient son obsédé de service.
1 2 3 4