James Kanze writes:
| Gabriel Dos Reis writes:
| |> James Kanze writes:
| |> | Gabriel Dos Reis writes:
| |> | |> James Kanze writes:
| |> | |> | Gabriel Dos Reis writes:
| |> | |> | |> "Amerio" writes:
| |> | |> | |> | J'ai un code dont l'interface est commune a toutes
| |> | |> | |> | mes plateformes, mais dont l'implémentation est
| |> | |> | |> | fortement spécifique. Ex : controller/Joypad.h et
| |> | |> | |> | controller/src/PS2/Joypad.h et
| |> | |> | |> | controller/src/XBOX/Joypad.h (oui ce sont des .h,
| |> | |> | |> | inline oblige)
| |> | |> | |> | Dans le code source (controller/src/Joypad.cpp),
| |> | |> | |> | on doit inclure le bon src/???/Joypad.h
| |> | |> | |> | Actuellement, on fait cela, sans pb (target défini
| |> | |> | |> | a PS2 ou XBOX, etc..):
| |> | |> | |> | #define PATH_CONTROLLER_JOYPAD <controller/src/##TARGET##/Joypad.h>
| |> | |> | |> | #include PATH_CONTROLLER_JOYPAD
| |> | |> | |> | Mais cette technique ne marche plus avec le
| |> | |> | |> | dernier (?) gcc (au passage : impossible de
| |> | |> | |> | changer de version de gcc, cette version est
| |> | |> | |> | imposée : 3.3.3 custom). Il nous jete avec le msg
| |> | |> | |> | : pasting "/" and "TARGET" does not give a valid
| |> | |> | |> | preprocessing token
| |> | |> | |> C'est que tu dois « stringifier » "/" avant de le
| |> | |> | |> concatener avec TARGET. En fait, tu dois «
| |> | |> | |> stringifier » toute la ligne, où ne concatener que
| |> | |> | |> des opérandes « stringifiées ».
| |> | |> | Formellement, dans ce contexte-ci, la stringification
| |> | |> | n'est pas légale,
| |> | |> pour quelles raisons ?
| |> | Parce que la stringification donne toujours une constante de
| |> | chaîne de caractêres (« string literal »),
| |> oui et tu sais ce que c'est ?
| Un « string literal » ? Je sais ce que dit la norme, oui. Et dans la
| contexte de la norme, c'est ce que dit la norme.
Bien, on fait des progrès. Est-ce que tu sais aussi ce qu'est un
remplacement de macro ?
| Parmi d'autres, c'est un token du préprocesseur d'un type bien
| déterminé.
Woaw.
| |> | et une constante de chaîne de caractères n'est pas légale dans
| |> | ce contexte.
| |> Groumph, lis un peu le texte pour savoir ce qu'est une chaîne de
| |> caractères et ce que fait l'opérateur # !
| |> | |> | au moins selon la norme.
| |> | |> Chapitres et versets ?
| |> | §16.2 et §16.3.2. C'est on ne peut plus clair, pour ceux qui
| |> | savent lire.
| |> Donc, je suppose que tu sais lire, puisque cela te paraît clair.
| |> Cependant, il me paraît évident que la fonction qui permet de
| |> comprendre ce que tu lis n'a pas été activée pendant ta
| |> studieuse lecture. Je te suggère donc de l'activer et de lire :
| [Description de ce que c'est qu'un « string literal » supprimé...]
| Ce qui est exactement ce que j'ai dit, n'est pas. Le résultat de la
| stringification, c'est bien un « string literal ».
Tu as répété cette partie là, mais cela ne suffit pas pour conclure
que le code posté par Jean-Marc est invalide. Tout au contraire --
parce que dans son code, il y a expansion, dans l'expansion, la chaîne
de caractère est substituée pour produire exactement ce qu'il contente
#include.
| Maintenant, lis §16.2 et montre-moi où elle dit qu'on a droit à un
| « string literal » dans un include. Tout ce que je vois là, ce sont des
Voir ci-dessus. Considère le code tel que posté par Jean-Marc
#define TARGET PS2
#define XSTR(x) #x
#define STR(x) XSTR(x)
#define PLATFILE(base,file) STR(base/TARGET/file)
#include PLATFILE(controller/src,Joypad.h)
Examinons pas à pas ce qui arrive à la dernière ligne:
(1) Elle est décomposée en suite de pp-tokens comme suit:
{#}{include} {PLATFILE}{(}{controller}{/}{src}{,}{Joypad.h}{)}
(2) À la phase de traduction 4:
Preprocessing directives are executed and macro invocations are
expanded. If a character sequence that matches the syntax of a
universal-character-name is produced by token concatenation
(16.3.3), the behavior is undefined. A #include preprocessing
directive causes the named header or source file to be processed
from phase 1 through phase 4, recursively.
Pour exécuter la directive ci-dessus, 16.2/4 ordonne:
A preprocessing directive of the form
# include pp-tokens new-line
(that does not match one of the two previous forms) is
permitted. The preprocessing tokens after include in the
directive are processed just as in normal text (each identifier
currently defined as a macro name is replaced by its replacement
list of preprocessing tokens). If the directive resulting after
all replacements does not match one of the two previous forms,
the behavior is undefined.140) The method by which a sequence of
preprocessing tokens between a < and a > preprocessing token
pair or a pair of " characters is combined into a single header
name preprocessing token is implementation-defined.
(3) Nous sommes amenés à faire expansion de la macro fonctionnelle
PLATFILE. La sémantique est dictée par 16.3.1/1 :
After the arguments for the invocation of a function-like macro
have been identified, argument substitution takes place. A
parameter in the replacement list, unless preceded by a # or ##
preprocessing token or followed by a ## preprocessing token (see
below), is replaced by the corresponding argument after all macros
contained therein have been expanded. Before being substituted,
each argument s preprocessing tokens are completely macro replaced
as if they formed the rest of the translation unit; no other
preprocessing tokens are available.
Les arguments dans l'invocation de la macro fonctionnelle PLATFILE
sont:
(a) {controller}{/}{src} pour le paramètre base ;
(b) {Joypad.h} pour le paramètre file.
La liste de remplacement est {STR}{(}{base}{/}{TARGET}{/}{file}{)}.
Après susbtitution, nous avons :
{STR}{(}{controller}{/}{src}{/}{TARGET}{/}{Joypad.h}{)}
(4) Le traitement n'est pas fini, nous enseigne 16.3.4/1
After all parameters in the replacement list have been
substituted, the resulting preprocessing token sequence is
rescanned with all subsequent preprocessing tokens of the
source file for more macro names to replace.
Donc nous devons faire une expansion pour STR. Ce nous donne
{XSTR}{(}{controller}{/}{src}{/}{PS2}{/}{Joypad.h}{)}
car comme le demande 16.3.1/1, nous devons d'abord faire une
substitution de TARGET qui est utilisée dans l'argument pour STR
(5) La macro XSTR utilise l'opérateur # de stringification. Donc, nous
devons suivre les prescriptions de 16.3.2/2
If, in the replacement list, a parameter is immediately preceded
by a # preprocessing token, both are replaced by a single
character string literal preprocessing token that contains the
spelling of the preprocessing token sequence for the
corresponding argument. Each occurrence of white space between
the argument s preprocessing tokens becomes a single space
character in the character string literal. White space before
the first preprocessing token and after the last preprocessing
token comprising the argument is deleted. Otherwise, the
original spelling of each preprocessing token in the argument is
retained in the character string literal, except for special
handling for producing the spelling of string literals and
character literals: a character is inserted before each " and
character of a character literal or string literal (including
the delimiting " characters). If the replacement that results is
not a valid character string literal, the behavior is
undefined. The order of evaluation of # and ## operators is
unspecified.
Suivant ces préceptes, l'expansion de la macro XSTR pour l'argument
donné ci-dessus produit
"controller/src/PS2/Joypad.h"
(6) Revenant à la directive #include PLATFILE(controller/src,Joypad.h)
à la base de ce long détour, après expansion de macro comme le
veut 16.2/4, elle donne
#include "controller/src/PS2/Joypad.h"
qui est bien de la forme scolaire dont tu parles juste ci-dessous
| q-char-sequence et des h-char-sequence. Et pour utiliser un
| q-char-sequence, il faut le mettre entre des "...".
Ben oui, et c'est bien ce que fait l'opérateur de stringification.
CQFD.
James Kanze <kanze@gabi-soft.fr> writes:
| Gabriel Dos Reis <gdr@cs.tamu.edu> writes:
| |> James Kanze <kanze@gabi-soft.fr> writes:
| |> | Gabriel Dos Reis <gdr@cs.tamu.edu> writes:
| |> | |> James Kanze <kanze@gabi-soft.fr> writes:
| |> | |> | Gabriel Dos Reis <gdr@cs.tamu.edu> writes:
| |> | |> | |> "Amerio" <amerio@hotmail.com> writes:
| |> | |> | |> | J'ai un code dont l'interface est commune a toutes
| |> | |> | |> | mes plateformes, mais dont l'implémentation est
| |> | |> | |> | fortement spécifique. Ex : controller/Joypad.h et
| |> | |> | |> | controller/src/PS2/Joypad.h et
| |> | |> | |> | controller/src/XBOX/Joypad.h (oui ce sont des .h,
| |> | |> | |> | inline oblige)
| |> | |> | |> | Dans le code source (controller/src/Joypad.cpp),
| |> | |> | |> | on doit inclure le bon src/???/Joypad.h
| |> | |> | |> | Actuellement, on fait cela, sans pb (target défini
| |> | |> | |> | a PS2 ou XBOX, etc..):
| |> | |> | |> | #define PATH_CONTROLLER_JOYPAD <controller/src/##TARGET##/Joypad.h>
| |> | |> | |> | #include PATH_CONTROLLER_JOYPAD
| |> | |> | |> | Mais cette technique ne marche plus avec le
| |> | |> | |> | dernier (?) gcc (au passage : impossible de
| |> | |> | |> | changer de version de gcc, cette version est
| |> | |> | |> | imposée : 3.3.3 custom). Il nous jete avec le msg
| |> | |> | |> | : pasting "/" and "TARGET" does not give a valid
| |> | |> | |> | preprocessing token
| |> | |> | |> C'est que tu dois « stringifier » "/" avant de le
| |> | |> | |> concatener avec TARGET. En fait, tu dois «
| |> | |> | |> stringifier » toute la ligne, où ne concatener que
| |> | |> | |> des opérandes « stringifiées ».
| |> | |> | Formellement, dans ce contexte-ci, la stringification
| |> | |> | n'est pas légale,
| |> | |> pour quelles raisons ?
| |> | Parce que la stringification donne toujours une constante de
| |> | chaîne de caractêres (« string literal »),
| |> oui et tu sais ce que c'est ?
| Un « string literal » ? Je sais ce que dit la norme, oui. Et dans la
| contexte de la norme, c'est ce que dit la norme.
Bien, on fait des progrès. Est-ce que tu sais aussi ce qu'est un
remplacement de macro ?
| Parmi d'autres, c'est un token du préprocesseur d'un type bien
| déterminé.
Woaw.
| |> | et une constante de chaîne de caractères n'est pas légale dans
| |> | ce contexte.
| |> Groumph, lis un peu le texte pour savoir ce qu'est une chaîne de
| |> caractères et ce que fait l'opérateur # !
| |> | |> | au moins selon la norme.
| |> | |> Chapitres et versets ?
| |> | §16.2 et §16.3.2. C'est on ne peut plus clair, pour ceux qui
| |> | savent lire.
| |> Donc, je suppose que tu sais lire, puisque cela te paraît clair.
| |> Cependant, il me paraît évident que la fonction qui permet de
| |> comprendre ce que tu lis n'a pas été activée pendant ta
| |> studieuse lecture. Je te suggère donc de l'activer et de lire :
| [Description de ce que c'est qu'un « string literal » supprimé...]
| Ce qui est exactement ce que j'ai dit, n'est pas. Le résultat de la
| stringification, c'est bien un « string literal ».
Tu as répété cette partie là, mais cela ne suffit pas pour conclure
que le code posté par Jean-Marc est invalide. Tout au contraire --
parce que dans son code, il y a expansion, dans l'expansion, la chaîne
de caractère est substituée pour produire exactement ce qu'il contente
#include.
| Maintenant, lis §16.2 et montre-moi où elle dit qu'on a droit à un
| « string literal » dans un include. Tout ce que je vois là, ce sont des
Voir ci-dessus. Considère le code tel que posté par Jean-Marc
#define TARGET PS2
#define XSTR(x) #x
#define STR(x) XSTR(x)
#define PLATFILE(base,file) STR(base/TARGET/file)
#include PLATFILE(controller/src,Joypad.h)
Examinons pas à pas ce qui arrive à la dernière ligne:
(1) Elle est décomposée en suite de pp-tokens comme suit:
{#}{include} {PLATFILE}{(}{controller}{/}{src}{,}{Joypad.h}{)}
(2) À la phase de traduction 4:
Preprocessing directives are executed and macro invocations are
expanded. If a character sequence that matches the syntax of a
universal-character-name is produced by token concatenation
(16.3.3), the behavior is undefined. A #include preprocessing
directive causes the named header or source file to be processed
from phase 1 through phase 4, recursively.
Pour exécuter la directive ci-dessus, 16.2/4 ordonne:
A preprocessing directive of the form
# include pp-tokens new-line
(that does not match one of the two previous forms) is
permitted. The preprocessing tokens after include in the
directive are processed just as in normal text (each identifier
currently defined as a macro name is replaced by its replacement
list of preprocessing tokens). If the directive resulting after
all replacements does not match one of the two previous forms,
the behavior is undefined.140) The method by which a sequence of
preprocessing tokens between a < and a > preprocessing token
pair or a pair of " characters is combined into a single header
name preprocessing token is implementation-defined.
(3) Nous sommes amenés à faire expansion de la macro fonctionnelle
PLATFILE. La sémantique est dictée par 16.3.1/1 :
After the arguments for the invocation of a function-like macro
have been identified, argument substitution takes place. A
parameter in the replacement list, unless preceded by a # or ##
preprocessing token or followed by a ## preprocessing token (see
below), is replaced by the corresponding argument after all macros
contained therein have been expanded. Before being substituted,
each argument s preprocessing tokens are completely macro replaced
as if they formed the rest of the translation unit; no other
preprocessing tokens are available.
Les arguments dans l'invocation de la macro fonctionnelle PLATFILE
sont:
(a) {controller}{/}{src} pour le paramètre base ;
(b) {Joypad.h} pour le paramètre file.
La liste de remplacement est {STR}{(}{base}{/}{TARGET}{/}{file}{)}.
Après susbtitution, nous avons :
{STR}{(}{controller}{/}{src}{/}{TARGET}{/}{Joypad.h}{)}
(4) Le traitement n'est pas fini, nous enseigne 16.3.4/1
After all parameters in the replacement list have been
substituted, the resulting preprocessing token sequence is
rescanned with all subsequent preprocessing tokens of the
source file for more macro names to replace.
Donc nous devons faire une expansion pour STR. Ce nous donne
{XSTR}{(}{controller}{/}{src}{/}{PS2}{/}{Joypad.h}{)}
car comme le demande 16.3.1/1, nous devons d'abord faire une
substitution de TARGET qui est utilisée dans l'argument pour STR
(5) La macro XSTR utilise l'opérateur # de stringification. Donc, nous
devons suivre les prescriptions de 16.3.2/2
If, in the replacement list, a parameter is immediately preceded
by a # preprocessing token, both are replaced by a single
character string literal preprocessing token that contains the
spelling of the preprocessing token sequence for the
corresponding argument. Each occurrence of white space between
the argument s preprocessing tokens becomes a single space
character in the character string literal. White space before
the first preprocessing token and after the last preprocessing
token comprising the argument is deleted. Otherwise, the
original spelling of each preprocessing token in the argument is
retained in the character string literal, except for special
handling for producing the spelling of string literals and
character literals: a character is inserted before each " and
character of a character literal or string literal (including
the delimiting " characters). If the replacement that results is
not a valid character string literal, the behavior is
undefined. The order of evaluation of # and ## operators is
unspecified.
Suivant ces préceptes, l'expansion de la macro XSTR pour l'argument
donné ci-dessus produit
"controller/src/PS2/Joypad.h"
(6) Revenant à la directive #include PLATFILE(controller/src,Joypad.h)
à la base de ce long détour, après expansion de macro comme le
veut 16.2/4, elle donne
#include "controller/src/PS2/Joypad.h"
qui est bien de la forme scolaire dont tu parles juste ci-dessous
| q-char-sequence et des h-char-sequence. Et pour utiliser un
| q-char-sequence, il faut le mettre entre des "...".
Ben oui, et c'est bien ce que fait l'opérateur de stringification.
CQFD.
James Kanze writes:
| Gabriel Dos Reis writes:
| |> James Kanze writes:
| |> | Gabriel Dos Reis writes:
| |> | |> James Kanze writes:
| |> | |> | Gabriel Dos Reis writes:
| |> | |> | |> "Amerio" writes:
| |> | |> | |> | J'ai un code dont l'interface est commune a toutes
| |> | |> | |> | mes plateformes, mais dont l'implémentation est
| |> | |> | |> | fortement spécifique. Ex : controller/Joypad.h et
| |> | |> | |> | controller/src/PS2/Joypad.h et
| |> | |> | |> | controller/src/XBOX/Joypad.h (oui ce sont des .h,
| |> | |> | |> | inline oblige)
| |> | |> | |> | Dans le code source (controller/src/Joypad.cpp),
| |> | |> | |> | on doit inclure le bon src/???/Joypad.h
| |> | |> | |> | Actuellement, on fait cela, sans pb (target défini
| |> | |> | |> | a PS2 ou XBOX, etc..):
| |> | |> | |> | #define PATH_CONTROLLER_JOYPAD <controller/src/##TARGET##/Joypad.h>
| |> | |> | |> | #include PATH_CONTROLLER_JOYPAD
| |> | |> | |> | Mais cette technique ne marche plus avec le
| |> | |> | |> | dernier (?) gcc (au passage : impossible de
| |> | |> | |> | changer de version de gcc, cette version est
| |> | |> | |> | imposée : 3.3.3 custom). Il nous jete avec le msg
| |> | |> | |> | : pasting "/" and "TARGET" does not give a valid
| |> | |> | |> | preprocessing token
| |> | |> | |> C'est que tu dois « stringifier » "/" avant de le
| |> | |> | |> concatener avec TARGET. En fait, tu dois «
| |> | |> | |> stringifier » toute la ligne, où ne concatener que
| |> | |> | |> des opérandes « stringifiées ».
| |> | |> | Formellement, dans ce contexte-ci, la stringification
| |> | |> | n'est pas légale,
| |> | |> pour quelles raisons ?
| |> | Parce que la stringification donne toujours une constante de
| |> | chaîne de caractêres (« string literal »),
| |> oui et tu sais ce que c'est ?
| Un « string literal » ? Je sais ce que dit la norme, oui. Et dans la
| contexte de la norme, c'est ce que dit la norme.
Bien, on fait des progrès. Est-ce que tu sais aussi ce qu'est un
remplacement de macro ?
| Parmi d'autres, c'est un token du préprocesseur d'un type bien
| déterminé.
Woaw.
| |> | et une constante de chaîne de caractères n'est pas légale dans
| |> | ce contexte.
| |> Groumph, lis un peu le texte pour savoir ce qu'est une chaîne de
| |> caractères et ce que fait l'opérateur # !
| |> | |> | au moins selon la norme.
| |> | |> Chapitres et versets ?
| |> | §16.2 et §16.3.2. C'est on ne peut plus clair, pour ceux qui
| |> | savent lire.
| |> Donc, je suppose que tu sais lire, puisque cela te paraît clair.
| |> Cependant, il me paraît évident que la fonction qui permet de
| |> comprendre ce que tu lis n'a pas été activée pendant ta
| |> studieuse lecture. Je te suggère donc de l'activer et de lire :
| [Description de ce que c'est qu'un « string literal » supprimé...]
| Ce qui est exactement ce que j'ai dit, n'est pas. Le résultat de la
| stringification, c'est bien un « string literal ».
Tu as répété cette partie là, mais cela ne suffit pas pour conclure
que le code posté par Jean-Marc est invalide. Tout au contraire --
parce que dans son code, il y a expansion, dans l'expansion, la chaîne
de caractère est substituée pour produire exactement ce qu'il contente
#include.
| Maintenant, lis §16.2 et montre-moi où elle dit qu'on a droit à un
| « string literal » dans un include. Tout ce que je vois là, ce sont des
Voir ci-dessus. Considère le code tel que posté par Jean-Marc
#define TARGET PS2
#define XSTR(x) #x
#define STR(x) XSTR(x)
#define PLATFILE(base,file) STR(base/TARGET/file)
#include PLATFILE(controller/src,Joypad.h)
Examinons pas à pas ce qui arrive à la dernière ligne:
(1) Elle est décomposée en suite de pp-tokens comme suit:
{#}{include} {PLATFILE}{(}{controller}{/}{src}{,}{Joypad.h}{)}
(2) À la phase de traduction 4:
Preprocessing directives are executed and macro invocations are
expanded. If a character sequence that matches the syntax of a
universal-character-name is produced by token concatenation
(16.3.3), the behavior is undefined. A #include preprocessing
directive causes the named header or source file to be processed
from phase 1 through phase 4, recursively.
Pour exécuter la directive ci-dessus, 16.2/4 ordonne:
A preprocessing directive of the form
# include pp-tokens new-line
(that does not match one of the two previous forms) is
permitted. The preprocessing tokens after include in the
directive are processed just as in normal text (each identifier
currently defined as a macro name is replaced by its replacement
list of preprocessing tokens). If the directive resulting after
all replacements does not match one of the two previous forms,
the behavior is undefined.140) The method by which a sequence of
preprocessing tokens between a < and a > preprocessing token
pair or a pair of " characters is combined into a single header
name preprocessing token is implementation-defined.
(3) Nous sommes amenés à faire expansion de la macro fonctionnelle
PLATFILE. La sémantique est dictée par 16.3.1/1 :
After the arguments for the invocation of a function-like macro
have been identified, argument substitution takes place. A
parameter in the replacement list, unless preceded by a # or ##
preprocessing token or followed by a ## preprocessing token (see
below), is replaced by the corresponding argument after all macros
contained therein have been expanded. Before being substituted,
each argument s preprocessing tokens are completely macro replaced
as if they formed the rest of the translation unit; no other
preprocessing tokens are available.
Les arguments dans l'invocation de la macro fonctionnelle PLATFILE
sont:
(a) {controller}{/}{src} pour le paramètre base ;
(b) {Joypad.h} pour le paramètre file.
La liste de remplacement est {STR}{(}{base}{/}{TARGET}{/}{file}{)}.
Après susbtitution, nous avons :
{STR}{(}{controller}{/}{src}{/}{TARGET}{/}{Joypad.h}{)}
(4) Le traitement n'est pas fini, nous enseigne 16.3.4/1
After all parameters in the replacement list have been
substituted, the resulting preprocessing token sequence is
rescanned with all subsequent preprocessing tokens of the
source file for more macro names to replace.
Donc nous devons faire une expansion pour STR. Ce nous donne
{XSTR}{(}{controller}{/}{src}{/}{PS2}{/}{Joypad.h}{)}
car comme le demande 16.3.1/1, nous devons d'abord faire une
substitution de TARGET qui est utilisée dans l'argument pour STR
(5) La macro XSTR utilise l'opérateur # de stringification. Donc, nous
devons suivre les prescriptions de 16.3.2/2
If, in the replacement list, a parameter is immediately preceded
by a # preprocessing token, both are replaced by a single
character string literal preprocessing token that contains the
spelling of the preprocessing token sequence for the
corresponding argument. Each occurrence of white space between
the argument s preprocessing tokens becomes a single space
character in the character string literal. White space before
the first preprocessing token and after the last preprocessing
token comprising the argument is deleted. Otherwise, the
original spelling of each preprocessing token in the argument is
retained in the character string literal, except for special
handling for producing the spelling of string literals and
character literals: a character is inserted before each " and
character of a character literal or string literal (including
the delimiting " characters). If the replacement that results is
not a valid character string literal, the behavior is
undefined. The order of evaluation of # and ## operators is
unspecified.
Suivant ces préceptes, l'expansion de la macro XSTR pour l'argument
donné ci-dessus produit
"controller/src/PS2/Joypad.h"
(6) Revenant à la directive #include PLATFILE(controller/src,Joypad.h)
à la base de ce long détour, après expansion de macro comme le
veut 16.2/4, elle donne
#include "controller/src/PS2/Joypad.h"
qui est bien de la forme scolaire dont tu parles juste ci-dessous
| q-char-sequence et des h-char-sequence. Et pour utiliser un
| q-char-sequence, il faut le mettre entre des "...".
Ben oui, et c'est bien ce que fait l'opérateur de stringification.
CQFD.
writes:
[...]
| C'est souvent difficile à savoir ce qui est l'intention, parce que
| la norme est une oeuvre collective, et les individus peuvent avoir
| des intentions différentes.
Et pour couronner le tout, il y a même des exemples dans le texte pour
expliquer comment les choses sont censées fonctionner
kanze@gabi-soft.fr writes:
[...]
| C'est souvent difficile à savoir ce qui est l'intention, parce que
| la norme est une oeuvre collective, et les individus peuvent avoir
| des intentions différentes.
Et pour couronner le tout, il y a même des exemples dans le texte pour
expliquer comment les choses sont censées fonctionner
writes:
[...]
| C'est souvent difficile à savoir ce qui est l'intention, parce que
| la norme est une oeuvre collective, et les individus peuvent avoir
| des intentions différentes.
Et pour couronner le tout, il y a même des exemples dans le texte pour
expliquer comment les choses sont censées fonctionner
writes:
| Gabriel Dos Reis wrote in message
| news:...
| > writes:
| > [...]
| > | C'est souvent difficile à savoir ce qui est l'intention, parce
| > | que la norme est une oeuvre collective, et les individus peuvent
| > | avoir des intentions différentes.
| > Et pour couronner le tout, il y a même des exemples dans le texte
| > pour expliquer comment les choses sont censées fonctionner
| Et il y a aussi une rationale, au moins pour C90. C'était un peu ce
| que j'essayais à dire -- l'auteur de l'exemple n'avait pas forcement
| les mêmes intentions que l'auteur du texte normatif.
| Je t'accorde que la présence de l'exemple suggère qu'au moins
| certains pensaient comme toi. N'empêche que le texte normatif est
| extrèmement clair -- le préprocesseur travaille avec des tokens, non
| avec des chaînes de caractères.
Je ne prétend pas que le préprocesseur travaille avec des chaînes de
caractères. Si tu suis ce que j'ai écrit, j'ai pris soin de découper
en suite de pp-tokens et de manipuler ces suites de tokens, du début
jusqu'à la fin. L'opérateur # demande qu'on rassemble l' « original
spelling » des pp-tokens et que d'une manière ou d'une autre on en
produise un header-name. C'est le seul endroit où on a besoin de faire
la conversion. Ailleurs, on en a pas besoin et je ne l'ai pas fait.
Fais attention à ce que tu écris.
| Ce qui ne va pas sans poser des problèmes dans la définition de
| l'opérateur # -- on est amené à parler de l'« orthographe original
| », par exemple.
| Je sais qu'à l'époque où la norme C était tout neuf, j'ai eu des
| discussions avec certains membres du comité -- je ne me rappelle
| plus qui, et que ce sont eux qui m'ont dit que la forme proposée par
| Jean-Marc était illégal, et que la bonne forme était celui du
| premier posting.
Peux-tu articuler clairement pourquoi cette solution du premier
posting est valide ?
kanze@gabi-soft.fr writes:
| Gabriel Dos Reis <gdr@cs.tamu.edu> wrote in message
| news:<m3lli7kc1l.fsf@merlin.cs.tamu.edu>...
| > kanze@gabi-soft.fr writes:
| > [...]
| > | C'est souvent difficile à savoir ce qui est l'intention, parce
| > | que la norme est une oeuvre collective, et les individus peuvent
| > | avoir des intentions différentes.
| > Et pour couronner le tout, il y a même des exemples dans le texte
| > pour expliquer comment les choses sont censées fonctionner
| Et il y a aussi une rationale, au moins pour C90. C'était un peu ce
| que j'essayais à dire -- l'auteur de l'exemple n'avait pas forcement
| les mêmes intentions que l'auteur du texte normatif.
| Je t'accorde que la présence de l'exemple suggère qu'au moins
| certains pensaient comme toi. N'empêche que le texte normatif est
| extrèmement clair -- le préprocesseur travaille avec des tokens, non
| avec des chaînes de caractères.
Je ne prétend pas que le préprocesseur travaille avec des chaînes de
caractères. Si tu suis ce que j'ai écrit, j'ai pris soin de découper
en suite de pp-tokens et de manipuler ces suites de tokens, du début
jusqu'à la fin. L'opérateur # demande qu'on rassemble l' « original
spelling » des pp-tokens et que d'une manière ou d'une autre on en
produise un header-name. C'est le seul endroit où on a besoin de faire
la conversion. Ailleurs, on en a pas besoin et je ne l'ai pas fait.
Fais attention à ce que tu écris.
| Ce qui ne va pas sans poser des problèmes dans la définition de
| l'opérateur # -- on est amené à parler de l'« orthographe original
| », par exemple.
| Je sais qu'à l'époque où la norme C était tout neuf, j'ai eu des
| discussions avec certains membres du comité -- je ne me rappelle
| plus qui, et que ce sont eux qui m'ont dit que la forme proposée par
| Jean-Marc était illégal, et que la bonne forme était celui du
| premier posting.
Peux-tu articuler clairement pourquoi cette solution du premier
posting est valide ?
writes:
| Gabriel Dos Reis wrote in message
| news:...
| > writes:
| > [...]
| > | C'est souvent difficile à savoir ce qui est l'intention, parce
| > | que la norme est une oeuvre collective, et les individus peuvent
| > | avoir des intentions différentes.
| > Et pour couronner le tout, il y a même des exemples dans le texte
| > pour expliquer comment les choses sont censées fonctionner
| Et il y a aussi une rationale, au moins pour C90. C'était un peu ce
| que j'essayais à dire -- l'auteur de l'exemple n'avait pas forcement
| les mêmes intentions que l'auteur du texte normatif.
| Je t'accorde que la présence de l'exemple suggère qu'au moins
| certains pensaient comme toi. N'empêche que le texte normatif est
| extrèmement clair -- le préprocesseur travaille avec des tokens, non
| avec des chaînes de caractères.
Je ne prétend pas que le préprocesseur travaille avec des chaînes de
caractères. Si tu suis ce que j'ai écrit, j'ai pris soin de découper
en suite de pp-tokens et de manipuler ces suites de tokens, du début
jusqu'à la fin. L'opérateur # demande qu'on rassemble l' « original
spelling » des pp-tokens et que d'une manière ou d'une autre on en
produise un header-name. C'est le seul endroit où on a besoin de faire
la conversion. Ailleurs, on en a pas besoin et je ne l'ai pas fait.
Fais attention à ce que tu écris.
| Ce qui ne va pas sans poser des problèmes dans la définition de
| l'opérateur # -- on est amené à parler de l'« orthographe original
| », par exemple.
| Je sais qu'à l'époque où la norme C était tout neuf, j'ai eu des
| discussions avec certains membres du comité -- je ne me rappelle
| plus qui, et que ce sont eux qui m'ont dit que la forme proposée par
| Jean-Marc était illégal, et que la bonne forme était celui du
| premier posting.
Peux-tu articuler clairement pourquoi cette solution du premier
posting est valide ?
Ou est-ce que l'opérateur de stringification met des "..." ? L'opérateur
de stringification génère un token de type string literal. L'autre façon
d'obtenir un string literal, évidemment, c'est de mettre le texte entre
des "...". Sauf que dans le contexte d'un include, mettre le texte entre
des "..." ne fait pas un string literal.
C'est une distinction très importante. Par exemple :
#include "a-b" // défini par l'implémentation,
// éventuellement illégal
char const a[] = "a-b" ; // défini par la norme.
La distinction est même très réele, dans des implémentations
existantes : sous Windows, "n" est bien une séquence de deux caractères
dans un q-char-sequence, mais non dans un string literal.
Ou est-ce que l'opérateur de stringification met des "..." ? L'opérateur
de stringification génère un token de type string literal. L'autre façon
d'obtenir un string literal, évidemment, c'est de mettre le texte entre
des "...". Sauf que dans le contexte d'un include, mettre le texte entre
des "..." ne fait pas un string literal.
C'est une distinction très importante. Par exemple :
#include "a-b" // défini par l'implémentation,
// éventuellement illégal
char const a[] = "a-b" ; // défini par la norme.
La distinction est même très réele, dans des implémentations
existantes : sous Windows, "n" est bien une séquence de deux caractères
dans un q-char-sequence, mais non dans un string literal.
Ou est-ce que l'opérateur de stringification met des "..." ? L'opérateur
de stringification génère un token de type string literal. L'autre façon
d'obtenir un string literal, évidemment, c'est de mettre le texte entre
des "...". Sauf que dans le contexte d'un include, mettre le texte entre
des "..." ne fait pas un string literal.
C'est une distinction très importante. Par exemple :
#include "a-b" // défini par l'implémentation,
// éventuellement illégal
char const a[] = "a-b" ; // défini par la norme.
La distinction est même très réele, dans des implémentations
existantes : sous Windows, "n" est bien une séquence de deux caractères
dans un q-char-sequence, mais non dans un string literal.