Подтвердить что ты не робот

Многострочные директивы DEFINE?

Я не эксперт, поэтому на меня легко. Существуют ли различия между этими двумя сегментами кода?

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

и

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

Кроме того, есть ли способ написать первый в одной строке? В чем смысл этого многострочного стиля? Является ли следующий код хорошим?

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

Ответ 1

Многострочный макрос полезен, если у вас есть очень сложный макрос, который будет трудно читать, если бы все было на одной строке (хотя это нецелесообразно иметь очень сложные макросы).

В общем, вы можете написать многострочное определение с использованием символа продолжения строки \. Так, например,

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

Но вы не можете сделать это со своим первым примером. Вы не можете разделить эти жетоны; оператор сдвига << всегда должен быть записан без каких-либо разделительных пробелов, иначе он будет интерпретироваться как два менее оператора. Так может быть:

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

который теперь эквивалентен вашему второму примеру.

[Хотя я не уверен, что этот макрос когда-либо будет полезен!]

Ответ 2

Например:

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

Вы можете отделить строки символом \. Обратите внимание, что это не зависит от макроса. Вы можете добавить символ \ в свой код, когда хотите разбить длинную строку.

Ответ 3

Первый не должен работать. Строки должны быть разделены обратной косой чертой. Например:

#define SOME_MACRO "whatever" \
"more" \
"yet more"