#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 :(得分:4)
一般来说,这是一个坏主意。具有讽刺意味的是,鉴于您的符号名称中包含“Google”,您可能很想知道Google's C++ Style Guide在定义它们之前会强制要求取消定义宏。基本上,如果多次定义宏,则会出现错误。 undef可以防止这些错误,这可以抑制一些可能应该关闭的警报。在某些情况下,undef有意义,例如在定义assert
时,每次包含标头时宏的行为都可能不同(基于是否定义了其他宏)。但是,如果宏应该对整个程序只有一个值,那么这个undef没有任何意义。
答案 1 :(得分:2)
它只是为了安全起见,或者为了预防措施我们可以说我们在定义它们之前取消定义宏,以便编译器在重新定义它们时不会显示任何警告/错误
答案 2 :(得分:0)
确保它们尚未以某种方式定义。否则,预处理器在第二次重新定义它们时可能会发出警告/错误。
答案 3 :(得分:0)
同样在这些值不同但变量保持不变的情况下。
例如
#define pi 3.1456
并沿着车道向下,您可能需要pi
作为3.14
。所以你能做的就是,
#undef pi
#define pi 3.14
来自示例here,
出现任何标识符 遵循这些
#undef
指令 没有替换任何更换 令牌。一旦定义了一个宏 已由#undef
删除 指令,可以使用标识符 在新的#define
指令中。