Зачем отменять определение макросов, прежде чем определять их? - PullRequest
1 голос
/ 06 августа 2010
#undef GOOGLE_LONGLONG
#undef GOOGLE_ULONGLONG
#undef GOOGLE_LL_FORMAT

#ifdef _MSC_VER
#define GOOGLE_LONGLONG(x) x##I64
#define GOOGLE_ULONGLONG(x) x##UI64
#define GOOGLE_LL_FORMAT "I64"  // As in printf("%I64d", ...)
#else
#define GOOGLE_LONGLONG(x) x##LL
#define GOOGLE_ULONGLONG(x) x##ULL
#define GOOGLE_LL_FORMAT "ll"  // As in "%lld". Note that "q" is poor form also.
#endif

Зачем это делать и когда делать такие вещи?

Ответы [ 4 ]

4 голосов
/ 06 августа 2010

Вообще это плохая идея. По иронии судьбы, учитывая, что у вас есть «Google» в именах ваших символов, вам может быть любопытно узнать, что Google C ++ Style Guide настоятельно рекомендует не определять неопределенные макросы перед их определением. По сути, если вы определите макрос несколько раз, вы получите ошибку. Undef предотвращает эти ошибки, которые могут подавить некоторые сигналы тревоги, которые, вероятно, должны сработать. Есть несколько случаев, когда undef имеет смысл, например, при определении assert, где поведение макроса может отличаться каждый раз, когда вы включаете заголовок (в зависимости от того, определен ли какой-либо другой макрос). Однако если макрос должен иметь одно значение для всей программы, это undef не имеет никакого смысла.

2 голосов
/ 06 августа 2010

Это просто ради безопасности, или мы можем сказать ради предосторожности, что мы определяем макросы перед их определением, чтобы компилятор не показывал никаких предупреждений / ошибок при их переопределении

0 голосов
/ 06 августа 2010

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

Например,

#define pi 3.1456

и вниз по полосе, вам может понадобиться pi как 3.14.Итак, что вы можете сделать, это:

#undef pi
#define pi 3.14

Из примера здесь ,

Любые вхождения идентификаторов, следующие за этими директивами #undef, незаменены на любые сменные токены.Как только определение макроса было удалено директивой #undef, идентификатор можно использовать в новой директиве #define.

0 голосов
/ 06 августа 2010

Чтобы убедиться, что они еще не определены.В противном случае препроцессор может выдавать предупреждения / ошибки, когда он переопределяет их во второй раз.

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