Многострочные DEFINE директивы? - PullRequest
49 голосов
/ 08 июня 2011

Я не эксперт, поэтому будьте спокойны со мной.Есть ли различия между этими двумя сегментами кода?

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

и

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

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

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

Ответы [ 3 ]

78 голосов
/ 08 июня 2011

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

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

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

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

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

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

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

20 голосов
/ 08 июня 2011

Например:

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

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

6 голосов
/ 08 июня 2011

Первый не должен работать. Строки должны быть разделены обратной косой чертой ТОЧКА новой строки. Вот так:

#define SOME_MACRO "whatever" \
"more" \
"yet more"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...