宏不应被重定义
3.2.11 ID_macro_redefined
宏不受作用域限制,重定义宏会使同一个全局名称产生多种不同的意义,易导致错误并降低可维护性。
示例:
#define M 1
int foo() {
#define M 0 // Non-compliant, redefined
return M;
}
int bar() {
return M; // Probably wrong
}
例中宏 M 在 foo 函数中被重定义,其影响范围是难以控制的,即使在重定义前用 #undef 取消定义也是不可取的,复用宏名称会使代码难以维护。
依据
ISO/IEC 9899:1999 6.10.3(2)
ISO/IEC 9899:2011 6.10.3(2)
ISO/IEC 14882:2003 16.3(2 3)
ISO/IEC 14882:2011 16.3(2)