Equivalent de l'operateur # mais pour une paire de quotes simples

Le
candide
Bonjour

La macro-fonction

#define STR(a) #a

développera l'appel

STR(+)

en

"+"


Je me demande s'il existerait une macro


#define SQ(a) /* A DEFINIR */


qui développerait

SQ(+)

en

'+'

Ca me parait assez improbable mais peut-être en savez-vous davantage.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Pierre Maurette
Le #18198741
candide, le 21/12/2008 a écrit :
Bonjour

La macro-fonction

#define STR(a) #a

développera l'appel

STR(+)

en

"+"


Je me demande s'il existerait une macro


#define SQ(a) /* A DEFINIR */


qui développerait

SQ(+)

en

'+'

Ca me parait assez improbable mais peut-être en savez-vous davantage.



Peut-être:
#define SQ(a) (#a[0])
?

Ou alors quelque chose m'échappe. Ce qui n'est pas à exclure, vu que le
sens de l'identifiant SQ ne me parle pas.

Bout de test:

[tests.inc]

TEST(+)
TEST(nom)
TEST(1)
TEST(n)
TEST(1+nom)
TEST(1.3)
TEST(1+2)
TEST("nom")

[test.c]

#include
#define STR(a) #a
#define SQ(a) (#a[0])

#define TEST(nom) printf("%st%ct%dn", STR(nom), SQ(nom), sizeof
SQ(nom));

int main(void)
{
#include "tests.inc"
return 0;
}

--
Pierre Maurette
candide
Le #18199211
Pierre Maurette a écrit :


Ou alors quelque chose m'échappe. Ce qui n'est pas à exclure, vu que le
sens de l'identifiant SQ ne me parle pas.



SQ : Simple Quote

OK, j'ai compris ce que tu a compris : extraire le premier caractère
d'une chaine et le placer entre une paire de _doubles_ apostrophes
alors que moi je cherche de _simples_ apostrophes pour récupérer une
constante caractère, genre 'c', 'k' ou '+' (en outre je ne cherche pas à
extraire).


Le problème a pour origine le fait que je souhaitais réduire par macro
la taille du code "multi-pliqué" ci-dessous :


case '+':
pile[hauteur - 2] += pile[hauteur - 1];
hauteur--;
break;
case '-':
pile[hauteur - 2] -= pile[hauteur - 1];
hauteur--;
break;
case '*':
pile[hauteur - 2] *= pile[hauteur - 1];
hauteur--;
break;
case '/':
pile[hauteur - 2] /= pile[hauteur - 1];
hauteur--;
break;

en le code simplifié :

#define CASE(op) /* ????????????? */

CASE(+);
CASE(-);
CASE(*);
CASE(/);
ld
Le #18200351
On 22 déc, 09:35, candide
Pierre Maurette a écrit :

> Ou alors quelque chose m'échappe. Ce qui n'est pas à exclure, vu qu e le
> sens de l'identifiant SQ ne me parle pas.

SQ : Simple Quote

OK, j'ai compris ce que tu a compris : extraire le premier caractère
d'une chaine et le placer entre une paire de _doubles_ apostrophes
alors que moi je cherche de _simples_ apostrophes pour récupérer une
constante caractère, genre 'c', 'k' ou '+' (en outre je ne cherche pas à
extraire).

Le problème a pour origine le fait que je souhaitais réduire par macr o
la taille du code "multi-pliqué" ci-dessous :

        case '+':
          pile[hauteur - 2] += pile[hauteur - 1];
          hauteur--;
          break;
        case '-':
          pile[hauteur - 2] -= pile[hauteur - 1];
          hauteur--;
          break;
        case '*':
          pile[hauteur - 2] *= pile[hauteur - 1];
          hauteur--;
          break;
        case '/':
          pile[hauteur - 2] /= pile[hauteur - 1];
          hauteur--;
          break;

en le code simplifié :

#define CASE(op) /* ????????????? */

          CASE(+);
          CASE(-);
          CASE(*);
          CASE(/);



quel est le probleme avec:

CASE('+');
CASE('-');
CASE('*');
CASE('/');

ce qui permettrait aussi d'utiliser CASE avec des enums ou des
constantes literales.

a+, ld.
Antoine Leca
Le #18200451
En news:494eca35$0$6697$, candide va escriure:
Je me demande s'il existerait une macro

#define SQ(a) /* A DEFINIR */


qui développerait

SQ(+)

en

'+'



Le compilo de Microsoft a (avait ?) un opérateur (#@ si je me souviens bien)
qui fait cela. C'est une extension qui lui est propre, et qui n'a pas été
reprise par ses (nombreux) émules, donc je suppute que ce n'est guère
utilisé.


En fait, pour un caractère du jeu de base (exécution), cela doit être le
plus souvent équivalent à
#define SQ(a) (0[#a])

Donc il n'y a d'intérêt réel que pour les caractères du jeu étendu
(multibytes et autres joyeusetés).


Antoine
Pierre Maurette
Le #18200441
Antoine Leca, le 22/12/2008 a écrit :
En news:494eca35$0$6697$, candide va escriure:
Je me demande s'il existerait une macro

#define SQ(a) /* A DEFINIR */


qui développerait

SQ(+)

en

'+'



Le compilo de Microsoft a (avait ?) un opérateur (#@ si je me souviens bien)
qui fait cela. C'est une extension qui lui est propre, et qui n'a pas été
reprise par ses (nombreux) émules, donc je suppute que ce n'est guère
utilisé.


En fait, pour un caractère du jeu de base (exécution), cela doit être le
plus souvent équivalent à
#define SQ(a) (0[#a])



N'est pas strictement équivalent à:
#define SQ(a) (#a[0])
ou:
#define SQ(a) (*(#a + 0))
ou:
#define SQ(a) (*(0 + #a))
?

--
Pierre Maurette
Antoine Leca
Le #18200581
En news:494f5136$0$5886$, candide va escriure:
Le problème a pour origine le fait que je souhaitais réduire par macro
la taille du code "multi-pliqué" ci-dessous :
case '+':
pile[hauteur - 2] += pile[hauteur - 1];
hauteur--;
break;
case '-':
pile[hauteur - 2] -= pile[hauteur - 1];
hauteur--;
break;


<snip>
en le code simplifié :

#define CASE(op) /* ????????????? */

CASE(+);
CASE(-);
CASE(*);
CASE(/);



CASE(=);
CASE(^); /* exponentiation*/
CASE(**);
CASE(<<);
CASE(>>);

?


Antoine
Antoine Leca
Le #18200571
En
news:,
ld va escriure:
On 22 déc, 09:35, candide
case '+':
pile[hauteur - 2] += pile[hauteur - 1];




^^
hauteur--;
break;
case '-':
pile[hauteur - 2] -= pile[hauteur - 1];




^^
hauteur--;
break;

en le code simplifié :

#define CASE(op) /* ????????????? */

CASE(+); CASE(-); CASE(*); CASE(/);



quel est le probleme avec:

CASE('+');

ce qui permettrait aussi d'utiliser CASE avec des enums ou des
constantes literales.



Que tu ne peux pas facilement écrire l'opération += (resp. -=, resp.etc)


Antoine
espie
Le #18200561
D'un autre cote, le preprocesseur de C est volontairement un peu limite.
Essayer de passer outre ces limitations, c'est chercher la corde pour se
pendre a mon avis...
candide
Le #18200551
ld a écrit :


quel est le probleme avec:

CASE('+');



C'est que je ne vois pas comment la macrofonction pourrait être capable
d'extraire ce qui est à l'intérieur de la paire d'apostrophe, et j'en ai
besoin pour écrire le + dans += .


ce qui permettrait aussi d'utiliser CASE avec des enums ou des
constantes literales.




Pas compris où tu voulais en venir. La seule chose à laquelle ça me fait
penser, c'est qu'on pourrait définir la macrofonction suivante :


#define CASE(sq_op,op) case sq_op : pile[hauteur - 2] op##= pile[hauteur
- 1];break


ce qui développe l'appel

CASE('+',+);

en ce que j'attends :

:~$ gcc -E mac.c
# 1 "mac.c"
# 1 "<interne>"
# 1 "<command-line>"
# 1 "mac.c"


case '+' : pile[hauteur - 2] += pile[hauteur - 1];break;



La duplication de l'opérateur dans l'appel est moche mais c'est mieux
que rien.


Sinon, la question que j'ai posée initialement dans ce post semble ne
pas avoir de réponse affirmative, cf. les posts initiés aux liens suivants :

http://groups.google.fr/group/comp.std.c/msg/67ee3f22ce5ccfe8?hl=fr

ou encore

http://groups.google.fr/group/comp.lang.c/msg/1555d340a2e690e6?hl=fr
Publicité
Poster une réponse
Anonyme