2010-08-06 3 views
1
#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 

Зачем делать это и когда делать такие вещи?Зачем определять макросы перед их определением?

+0

Почему вы используете Google в своих символьных именах? –

+0

Возможно, это связано с http://protobuf.googlecode.com/svn-history/r300/trunk/src/google/protobuf/stubs/common.h – rwong

ответ

4

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

0

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

+0

Технически это препроцессор, предоставляющий ошибки, а не компилятор. Но, да, это должно потерпеть неудачу, если вы попытаетесь переопределить без первой неопределенности. –

+0

Это немного вводит в заблуждение; ваш ответ может быть истолкован как означающий, что он предотвращает предыдущие определения, но на самом деле это касается их существования, молча игнорируя их. – jamesdlin

+1

@Steven Sudit: он должен потерпеть неудачу только в том случае, если два макроопределения различны. – jamesdlin

2

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

+5

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

0

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

Для

например
#define pi 3.1456 

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

#undef pi 
#define pi 3.14 

Из примера here,

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

Смежные вопросы