'у { оператор; } а(0)' против 'заявление' при написании макроса?


Какой из следующих является предпочтительным и почему при написании макроса?

Тип 1

#define I2C_START()                 I2C_WAIT_IDLE(); SSP1CON2bits.SEN  = 1

Тип 2

#define I2C_START()               \
    do                            \
    {                             \
        I2C_WAIT_IDLE();          \
        SSP1CON2bits.SEN  = 1;    \
    }while(0)

Один из моих коллег предпочитает Тип 1 хотя я предпочитаю Тип 2. Поэтому, когда оба из нас работают в проекте, оба типа не видно на протяжении всего проекта.



2865
7
задан 6 апреля 2011 в 04:04 Источник Поделиться
Комментарии
4 ответа

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

if (condition)
I2c_START;

Тип 1: сбой
Тип 2: ОК

Конечно, с хорошим стандарты кодирования, которые можно избежать (всегда использовать '{' '}' на если). Но каждый сейчас и потом человек может быть ленивым (или просто невнимательный) и второй вариант предотвращает аварии от случаться.

Самое лучшее решение-не использовать макросы. Используют функции и пусть компилятор работает, когда встроенные.

Отредактированы:

Для Билли: (Тип 3) не делать пока

#define I2C_START()   \
{ \
I2C_WAIT_IDLE(); \
SSP1CON2bits.SEN = 1; \
}

К сожалению, это не удается, если вы используете другой стороны, если заявление:
Конечные точки с запятой (Тип 3) обозначает конец оператора if , таким образом, еще не синтаксически допускается. По крайней мере, это дает ошибку компиляции в отличие от вышеперечисленных. Но Тип 2 по-прежнему работает, как ожидалось.

if (condition)
I2C_START();
else
std::cout << "FAIL this test\n";

Тип 1: сбой
Тип 2: ОК
Тип 3: не

15
ответ дан 6 апреля 2011 в 07:04 Источник Поделиться

Ядра Linux для новичков чаво есть запись об этом, так как Linux использует его широко. Это синтаксис-безопасный способ определения такого рода макросов.

6
ответ дан 7 апреля 2011 в 12:04 Источник Поделиться

Вторая форма является наиболее безопасным, не думать слишком много о последствиях путь.

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

4
ответ дан 8 апреля 2011 в 04:04 Источник Поделиться

Я что-то похожее на два типа, но не делать в то время, как в:

#define I2C_START()               \
do \
{ \
I2C_WAIT_IDLE(); \
SSP1CON2bits.SEN = 1; \
}while(0)

Сделай хотя может быть трудно понять, для неопытного верстальщика. Я тоже всегда используйте {} даже для покатушки , если заявления.

0
ответ дан 5 мая 2011 в 11:05 Источник Поделиться