C: эффективное использование макросов - PullRequest
3 голосов
/ 10 сентября 2009
#ifndef MACROS_NULLCHECK_H_
#define MACROS_NULLCHECK_H_

#include <assert.h>

#define NULLCHECK(x) assert(x != (void *) 0);

#endif

Если бы я использовал вышеуказанный стиль в качестве шаблона для объявления макросов, какие бы у вас были условия?

Ответы [ 6 ]

14 голосов
/ 10 сентября 2009
  • поставить круглые скобки вокруг аргумента (это предотвращает проблемы при передаче выражений)

  • не ставь; в конце (использование будет более естественным)

    # определить NULLCHECK (x) подтвердить ((x)! = (Void *) 0)

3 голосов
/ 10 сентября 2009

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

assert((x) != (void*) 0)

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

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

NULLCHECK(pSomething);

, который выглядит более похожим на C и совместимым с остальным кодом.

3 голосов
/ 10 сентября 2009

Одно изменение, которое я мог бы сделать, это прокомментировать закрытие #endif:

#endif  // MACROS_NULLCHECK_H_

Это упрощает понимание того, что делает #endif, когда файл становится длиннее экрана.

1 голос
/ 10 сентября 2009

Некоторые полезные макросы из CERT C Secure Coding Wiki :

PRE00-C. Предпочитаю встроенные или статические функции функциональным макросам
PRE01-С. Используйте скобки в макросах вокруг имен параметров
PRE02-С. Списки замены макросов должны быть заключены в скобки
PRE03-С. Предпочитаю typedefs определению для типов кодирования
PRE10-С. Обернуть несколько операторов макросов в цикл do-while
PRE11-С. Не завершайте определение макроса одного оператора точкой с запятой
PRE31-С. Никогда не вызывайте небезопасный макрос с аргументами, содержащими присваивание, увеличение, уменьшение, изменчивый доступ или вызов функции
PRE32-С. Не используйте директивы препроцессора внутри аргументов макроса

0 голосов
/ 10 сентября 2009

Чтобы применить ;, используйте

#define NULLCHECK(x) do { assert((X)); } while (0)
0 голосов
/ 10 сентября 2009

выглядит хорошо. Это шаблон, который я часто использую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...