web-dev-qa-db-fra.com

Directives DEFINE multilignes?

Je ne suis pas un expert, alors allez-y doucement avec moi. Existe-t-il des différences entre ces deux segments de code?

#define BIT3 (0x1
<
<
3)
static int a;

et

#define BIT3 (0x1 << 3) static int a;

Existe-t-il également un moyen d'écrire le premier sur une seule ligne? Quel est l'intérêt de ce style multi-lignes? Le code suivant est-il bon?

#define BIT3 (0x1 << 3)
static int a;
49
Adam S

Une macro multi-lignes est utile si vous avez une macro très complexe qui serait difficile à lire si elle était sur une seule ligne (bien qu'il soit déconseillé d'avoir des macros très complexes).

En général, vous pouvez écrire une définition multiligne à l'aide du caractère de continuation de ligne, \. Donc par exemple.

#define MY_MACRO    printf( \
    "I like %d types of cheese\n", \
    5 \
    )

Mais vous ne pouvez pas faire cela avec votre premier exemple. Vous ne pouvez pas diviser des jetons comme ça; le << l'opérateur de décalage vers la gauche doit toujours être écrit sans aucun espace de séparation, sinon il serait interprété comme deux opérateurs inférieurs à. Alors peut-être:

#define BIT3 (0x1 \
    << \
    3) \
    static int a;

qui est maintenant équivalent à votre deuxième exemple.

[Bien que je ne sois pas sûr de la façon dont cette macro serait utile!]

80

Par exemple:

#define fact(f,n)   for (f=1; (n); (n)--) \
                      f*=n;

Vous pouvez séparer les lignes avec le \ personnage. Notez qu'il n'est pas spécifique à une macro. Vous pouvez ajouter le \ caractère dans votre code chaque fois que vous souhaitez rompre une longue ligne.

20
phoxis

Le premier ne devrait pas fonctionner. Les lignes doivent être séparées par une barre oblique inverse PUIS la nouvelle ligne. Ainsi:

#define SOME_MACRO "whatever" \
"more" \
"yet more"
6
Prof. Falken