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

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

9 réponses
Avatar
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.

9 réponses

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

#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
Avatar
candide
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(/);
Avatar
ld
On 22 déc, 09:35, candide wrote:
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.
Avatar
Antoine Leca
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
Avatar
Pierre Maurette
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
Avatar
Antoine Leca
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
Avatar
Antoine Leca
En
news:,
ld va escriure:
On 22 déc, 09:35, candide wrote:
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
Avatar
espie
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...
Avatar
candide
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